你们好。欢迎你们关注由我为你们带来的Unity3D游戏开发系列文章,个人博客地址为:http://blog.csdn.net/qinyuanpei。css
在上一篇文章中,咱们基本上实现了一个小地图的功能,今天呢,咱们来实现怪物AI,所谓怪物AI就是指咱们为怪物编写必定的算法。使其可以具有必定程度的智能化,以加强游戏的可玩性。在通常的RPG游戏中,怪物一般在一个游戏设定的范围内巡逻。当玩家进入怪物的警惕范围时,怪物就会由巡逻状态转变为攻击状态,向玩家进行攻击,那么,咱们今天就来实现一个简单的怪物AI吧,如下咱们一块儿来看代码:html
- using UnityEngine;
- using System.Collections;
-
- public class AI : MonoBehaviour {
-
-
- public const int STATE_STAND=0;
- public const int STATE_WALK=1;
- public const int STATE_RUN=2;
-
-
- private int NowState;
-
- public GameObject Hero;
-
- public const int AI_THINK_TIME=2;
-
- public const int AI_ATTACT_DISTANCE=10;
-
-
- private float LastThinkTime;
-
- void Start ()
- {
-
- }
-
- void Update ()
- {
-
- if(Vector3.Distance(transform.position,Hero.transform.position)<AI_ATTACT_DISTANCE)
- {
-
- this.GetComponent<Animation>().Play("run");
-
- NowState=STATE_RUN;
-
- transform.LookAt(Hero.transform);
-
- transform.Translate(Vector3.forward*Time.deltaTime * 5);
- }else
- {
-
- if(Time.time-LastThinkTime>AI_THINK_TIME)
- {
-
- LastThinkTime=Time.time;
-
- int Rnd=Random.Range(0,2);
-
- switch(Rnd)
- {
- case 0:
-
- this.GetComponent<Animation>().Play("idle");
- NowState=STATE_STAND;
- break;
-
- case 1:
-
-
- Quaternion mRotation=Quaternion.Euler(0,Random.Range(1,5)*90,0);
- transform.rotation=Quaternion.Slerp(transform.rotation,mRotation,Time.deltaTime*1000);
-
- this.GetComponent<Animation>().Play("walk");
-
- transform.Translate(Vector3.forward*Time.deltaTime * 3);
- NowState=STATE_WALK;
- break;
-
- case 2:
-
- this.GetComponent<Animation>().Play("run");
- transform.Translate(Vector3.forward*Time.deltaTime * 5);
- NowState=STATE_RUN;
- break;
- }
- }
- }
- }
- }
在上面的代码中,可以触发怪物状态发生变化的有两个条件,第一,是玩家进入了怪物的警范围。此时怪物将面向玩家奔跑靠近;第二,当前时间与怪物上一次思考的时间之差大于怪物的思考时间,此时,怪物将随机做出反应。
好。如下咱们回到游戏界面其中来。算法

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


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