你們好。歡迎你們關注由我爲你們帶來的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