Unity学习简易单人FPS开发——AI实现(部分)
關(guān)于Crieria項目AI的實現(xiàn)
步驟一:敵方AI的生成與觸發(fā)
? ? 關(guān)于敵方目標的生成采用隨機布局與觸發(fā)點生成——在每一次玩家初始化(讀檔,開始游戲,死亡)時,規(guī)定數(shù)量的AI單位自動刷新在固定區(qū)域的隨機位置上;特定巡邏單位在固定位置刷新并賦予巡邏位點與偵測半徑。固定AI主要起環(huán)境的作用,巡邏AI在充當環(huán)境體的同時兼具觸發(fā)器開關(guān)。這是初始化隨機布局的形式
? ? ?關(guān)于觸發(fā)AI生成的機制,大體分為兩種:劇情觸發(fā),條件觸發(fā)。劇情觸發(fā)因素由Controller控制,在一定觸發(fā)條件下Controller中的相關(guān)bool值改變,bool值作用于其場景內(nèi)的AI出現(xiàn)點進行AI生成,在劇情走向結(jié)束后或初始化后bool值歸位AI停止生成。也可以在controller中加入AI種類變化的選項來進行多樣化的生成機制;條件觸發(fā)種類較多,一般用于銜接劇情與游戲時間推展方向使用。多用于地形遭遇戰(zhàn),環(huán)境遭遇戰(zhàn),特殊情況遭遇戰(zhàn)。觸發(fā)點為碰撞觸發(fā)或者是條件觸發(fā) :狹窄地形觸發(fā)器會產(chǎn)生數(shù)個AI觸發(fā)后Destory;區(qū)域觸發(fā)進入觸發(fā)持續(xù)產(chǎn)生AI離開區(qū)域后觸發(fā)結(jié)束并Destory;巡邏探測到后條件觸發(fā)持續(xù)產(chǎn)生AI,觸發(fā)巡邏被消滅后觸發(fā)結(jié)束。
Unity具體實列(Unity炸了之后補)。
步驟二:自動尋路設(shè)置與敵對AI交互機制
Unity NavMesh的設(shè)定,Unity自帶有自動尋路的組件而且功能齊全:(以下為官方文檔中對導(dǎo)航系統(tǒng)的描述)
?
導(dǎo)航系統(tǒng)允許您創(chuàng)建可以導(dǎo)航游戲世界的角色。它讓你的角色能夠理解他們需要走樓梯才能到達二樓,或跳過一條溝。Unity?NavMesh
系統(tǒng)由以下部分組成:
- NavMesh(導(dǎo)航網(wǎng)格的簡稱)是一種數(shù)據(jù)結(jié)構(gòu),它描述了游戲世界的可行走表面,并允許在游戲世界中找到從一個可步行位置到另一個可步行位置的路徑。數(shù)據(jù)結(jié)構(gòu)是從您的關(guān)卡幾何體自動構(gòu)建或烘焙的。
- NavMesh Agent?組件
?GameObject?幫助您創(chuàng)建在朝著目標前進時避開彼此的角色。代理商使用NavMesh了解游戲世界,他們知道如何避免彼此以及移動障礙。 - Off-Mesh Link組件允許您合并使用可行走表面無法表示的導(dǎo)航快捷方式。例如,跳過溝渠或圍欄,或在走過它之前打開門,可以全部描述為離網(wǎng)鏈接。
- NavMeshAgent組件允許您描述代理在導(dǎo)航世界時應(yīng)避免的移動障礙。由物理系統(tǒng)控制的槍管或箱子是障礙物的一個很好的例子。雖然障礙物正在移動,但是特工盡力避免它,但是一旦障礙物變得靜止,它將在導(dǎo)航網(wǎng)中雕刻一個洞,以便代理人可以改變他們的路徑以繞過它,或者如果固定的障礙物阻擋了路徑方式,代理可以找到不同的路線。
導(dǎo)航主要由邊界,障礙,網(wǎng)絡(luò)和錨點組成以實現(xiàn)對AI的導(dǎo)航作用。其設(shè)置主要考慮場景建模與玩家的預(yù)設(shè)定路線有關(guān),AI在前往玩家位置時的不同路徑與適當?shù)腁I掩體,同時考慮其出生點的位置與到玩家的路徑。
狀態(tài)切換與動畫的源碼:(未優(yōu)化
public class EnemyControler : MonoBehaviour { /// <summary>/// 敵方移動速度/// </summary>public float MoveSpeed = 3.0f;/// <summary>/// 狀態(tài)變量(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) //狀態(tài)切換{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){}})
總結(jié)
以上是生活随笔為你收集整理的Unity学习简易单人FPS开发——AI实现(部分)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: UVM RAL 中的显示预测 uvm
- 下一篇: AI 趋势