[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

相關文章
相關標籤/搜索