在上一篇文章中,我们基本上实现了一个小地图的功能,今天呢,我们来实现怪物AI,所谓怪物AI就是指我们为怪物编写一定的算法。使其能够具备一定程度的智能化,以增强游戏的可玩性。在一般的RPG游戏中,怪物通常在一个游戏设定的范围内巡逻。当玩家进入怪物的警戒范围时,怪物就会由巡逻状态转变为攻击状态,向玩家进行攻击,那么,我们今天就来实现一个简单的怪物AI吧,以下我们一起来看代码:

​​




  1. using UnityEngine;  
  2. using System.Collections;  
  3.   
  4. public class AI : MonoBehaviour {  
  5.   
  6.     //定义怪物的四种状态:站立、行走、奔跑、无所事事  
  7.     public const int STATE_STAND=0;  
  8.     public const int STATE_WALK=1;  
  9.     public const int STATE_RUN=2;  
  10.       
  11.     //怪物当前状态  
  12.     private int NowState;  
  13.     //游戏角色  
  14.     public GameObject Hero;  
  15.     //怪物思考时间  
  16.     public const int AI_THINK_TIME=2;  
  17.     //触发怪物攻击的临界距离  
  18.     public const int AI_ATTACT_DISTANCE=10;  
  19.       
  20.     //上一次思考的时间  
  21.     private float LastThinkTime;  
  22.       
  23.     void Start ()   
  24.     {  
  25.           
  26.     }  
  27.       
  28.     void Update ()   
  29.     {  
  30.        //当敌人与怪物间的距离小于攻击范围半径的时候  
  31.        if(Vector3.Distance(transform.position,Hero.transform.position)<AI_ATTACT_DISTANCE)  
  32.        {  
  33.           //敌人開始奔跑  
  34.           this.GetComponent<Animation>().Play("run");  
  35.           //敌人进入奔跑状态  
  36.           NowState=STATE_RUN;  
  37.           //使敌人面向角色  
  38.           transform.LookAt(Hero.transform);  
  39.           //向玩家靠近  
  40.           transform.Translate(Vector3.forward*Time.deltaTime * 5);  
  41.        }else  
  42.        {  
  43.           //当当前时间与上一次思考时间的差值大于怪物的思考时间时怪物開始思考  
  44.           if(Time.time-LastThinkTime>AI_THINK_TIME)  
  45.           {  
  46.              //開始思考  
  47.              LastThinkTime=Time.time;  
  48.              //获取0-3之间的随机数字  
  49.              int Rnd=Random.Range(0,2);        
  50.              //依据随机数值为怪物赋予不同的状态行为  
  51.              switch(Rnd)  
  52.              {  
  53.                 case 0:  
  54.                 //站立状态  
  55.                 this.GetComponent<Animation>().Play("idle");  
  56.                 NowState=STATE_STAND;  
  57.                 break;  
  58.                   
  59.                 case 1:  
  60.                 //行走状态  
  61.                 //使怪物旋转以完毕行走动作  
  62.                 Quaternion mRotation=Quaternion.Euler(0,Random.Range(1,5)*90,0);  
  63.                 transform.rotation=Quaternion.Slerp(transform.rotation,mRotation,Time.deltaTime*1000);  
  64.                 //播放动画  
  65.                 this.GetComponent<Animation>().Play("walk");  
  66.                 //改变位置  
  67.                 transform.Translate(Vector3.forward*Time.deltaTime * 3);  
  68.                 NowState=STATE_WALK;  
  69.                 break;  
  70.                  
  71.                 case 2:  
  72.                 //奔跑状态  
  73.                 this.GetComponent<Animation>().Play("run");  
  74.                 transform.Translate(Vector3.forward*Time.deltaTime * 5);  
  75.                 NowState=STATE_RUN;  
  76.                 break;  
  77.              }   
  78.           }  
  79.        }  
  80.     }  
  81. }  


          在上面的代码中,能够触发怪物状态发生变化的有两个条件,第一,是玩家进入了怪物的警范围。此时怪物将面向玩家奔跑靠近;第二,当前时间与怪物上一次思考的时间之差大于怪物的思考时间,此时,怪物将随机作出反应。


          好。以下我们回到游戏界面其中来。

[Unity3D]Unity3D游戏开发之怪物AI_.net

        如图,博主事先从官方资源商店里下载了一个人物模型。在这个模型中,设计者已经为我们设计好了人物动画,我们将这个模型拖放到场景中,调整到合适的位置。并将人物默认动画设置为idle。以下我们将刚才写好的脚本拖放到此模型上,并设置Hero为我们的玩家对象,在这里我们使用了官方提供的第三人称角色控制器组件,终于实现的效果例如以下 :

[Unity3D]Unity3D游戏开发之怪物AI_3d_02

[Unity3D]Unity3D游戏开发之怪物AI_随机数_03

       能够看到,在不同的时刻。怪物能够自己运行不同的状态动作,当玩家靠近怪物的时候。会被敌人追击,这就是今天的内容啦,谢谢大家!