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

你们好。欢迎你们关注由我为你们带来的Unity3D游戏开发系列文章,个人博客地址为:http://blog.csdn.net/qinyuanpei。css

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

[csharp]  view plain copy print ?

在CODE上查看代码片派生到个人代码片

  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. }  

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

          好。如下咱们回到游戏界面其中来。算法


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



       可以看到,在不一样的时刻。怪物可以本身运行不一样的状态动做,当玩家靠近怪物的时候。会被敌人追击,这就是今天的内容啦,谢谢你们!ide



转载:原文出处post