Unity学习简易单人FPS开发——AI实现(部分)
關于Crieria項目AI的實現
步驟一:敵方AI的生成與觸發
? ? 關于敵方目標的生成采用隨機布局與觸發點生成——在每一次玩家初始化(讀檔,開始游戲,死亡)時,規定數量的AI單位自動刷新在固定區域的隨機位置上;特定巡邏單位在固定位置刷新并賦予巡邏位點與偵測半徑。固定AI主要起環境的作用,巡邏AI在充當環境體的同時兼具觸發器開關。這是初始化隨機布局的形式
? ? ?關于觸發AI生成的機制,大體分為兩種:劇情觸發,條件觸發。劇情觸發因素由Controller控制,在一定觸發條件下Controller中的相關bool值改變,bool值作用于其場景內的AI出現點進行AI生成,在劇情走向結束后或初始化后bool值歸位AI停止生成。也可以在controller中加入AI種類變化的選項來進行多樣化的生成機制;條件觸發種類較多,一般用于銜接劇情與游戲時間推展方向使用。多用于地形遭遇戰,環境遭遇戰,特殊情況遭遇戰。觸發點為碰撞觸發或者是條件觸發 :狹窄地形觸發器會產生數個AI觸發后Destory;區域觸發進入觸發持續產生AI離開區域后觸發結束并Destory;巡邏探測到后條件觸發持續產生AI,觸發巡邏被消滅后觸發結束。
Unity具體實列(Unity炸了之后補)。
步驟二:自動尋路設置與敵對AI交互機制
Unity NavMesh的設定,Unity自帶有自動尋路的組件而且功能齊全:(以下為官方文檔中對導航系統的描述)
?
導航系統允許您創建可以導航游戲世界的角色。它讓你的角色能夠理解他們需要走樓梯才能到達二樓,或跳過一條溝。Unity?NavMesh
系統由以下部分組成:
- NavMesh(導航網格的簡稱)是一種數據結構,它描述了游戲世界的可行走表面,并允許在游戲世界中找到從一個可步行位置到另一個可步行位置的路徑。數據結構是從您的關卡幾何體自動構建或烘焙的。
- NavMesh Agent?組件
?GameObject?幫助您創建在朝著目標前進時避開彼此的角色。代理商使用NavMesh了解游戲世界,他們知道如何避免彼此以及移動障礙。 - Off-Mesh Link組件允許您合并使用可行走表面無法表示的導航快捷方式。例如,跳過溝渠或圍欄,或在走過它之前打開門,可以全部描述為離網鏈接。
- NavMeshAgent組件允許您描述代理在導航世界時應避免的移動障礙。由物理系統控制的槍管或箱子是障礙物的一個很好的例子。雖然障礙物正在移動,但是特工盡力避免它,但是一旦障礙物變得靜止,它將在導航網中雕刻一個洞,以便代理人可以改變他們的路徑以繞過它,或者如果固定的障礙物阻擋了路徑方式,代理可以找到不同的路線。
導航主要由邊界,障礙,網絡和錨點組成以實現對AI的導航作用。其設置主要考慮場景建模與玩家的預設定路線有關,AI在前往玩家位置時的不同路徑與適當的AI掩體,同時考慮其出生點的位置與到玩家的路徑。
狀態切換與動畫的源碼:(未優化
public class EnemyControler : MonoBehaviour { /// <summary>/// 敵方移動速度/// </summary>public float MoveSpeed = 3.0f;/// <summary>/// 狀態變量(int)/// </summary>public int StateNum;/// <summary>/// 開火冷卻/// </summary>public int ShootTimes=3;/// <summary>/// 走動距離變量/// </summary>public float WalkRange = 20f;/// <summary>/// 跑動距離變量/// </summary>public float RushRange = 30f;/// <summary>/// 開火距離變量/// </summary>public float ShootRange = 10f;/// <summary>/// 確定Player目標/// </summary>public GameObject Player;/// <summary>/// 儲存Player與Enemy的位置信息/// </summary>private Vector3 transPlayer;private Vector3 transEnemy;/// <summary>/// 當前距離/// </summary>public float Range;bool isAlive;//判斷Player是否存貨public Animator idem;void Start(){StateNum = 1;//初始化StateNum}void FixedUpdate(){//isAlive = Player.GetComponent<PlayerControler>().isplayeralive; //確認Player存活WalkRange = RushRange - ShootRange;transEnemy = transform.position;transPlayer = Player.transform.position;Range = Vector3.Distance(transPlayer, transEnemy); //測距// if (isalive)// {if (Range > ShootRange && Range <= RushRange) //狀態切換{StateNum = 3;idem.SetInteger("State", 3);}if (Range > RushRange){StateNum = 4;idem.SetInteger("State", 4);idem.SetBool("isrunning",true);}if (Range <= ShootRange){StateNum = 5;idem.SetInteger("State", 5);}// }// else// {// StateNum = 1;// }}void EnemyWalk(){}void EnemyRun(){}void EnemyCross(){}void EnemyFire(){for(int i = 0; i < ShootTimes - 1; i++){EnemyShoot();}}void Eliminate(){}void EnemyShoot(){}private void OnCollisionEnter(Collision collision){}})
總結
以上是生活随笔為你收集整理的Unity学习简易单人FPS开发——AI实现(部分)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: UVM RAL 中的显示预测 uvm
- 下一篇: android sdk所有版本下载,an