【教程】Unity行為樹插件behaviour trees制作敵人AI
這里是楓2,最近比較忙,先做個圖文版,空了來做個視頻版…………
看這個教程前首先大家要知道unity的行為樹插件behaviour tree,如果不知道可以搜索,這方面的教程很多,我就不做了,總之就是一個可視化無代碼做敵人AI的插件
教程的功能需要買兩個內(nèi)容,第一個是behaviour主插件,第二個是MovementPack,建議大家打折購買


AI邏輯
我要設(shè)計個AI,邏輯是這樣的,當(dāng)敵人發(fā)現(xiàn)范圍內(nèi)的player,就會靠近player,在靠近player足夠近的時候,會攻擊玩家,當(dāng)玩家遠(yuǎn)離敵人的時候會拉脫戰(zhàn)
我們就一步步來完善這個AI邏輯
掛上腳本
首先我們要在敵人身上掛上腳本,其中包含兩個腳本


設(shè)置導(dǎo)航區(qū)域
關(guān)于導(dǎo)航的內(nèi)容可以去查閱導(dǎo)航插件的相關(guān)教程,這里就簡單說明下了
把需要導(dǎo)航的區(qū)域設(shè)置成導(dǎo)航static

菜單的Windows-AI-Nav.....打開導(dǎo)航窗口
在導(dǎo)航窗口里這樣設(shè)置

上圖切到Bake按鈕,點擊Bake區(qū)域,你地圖上會有一片藍(lán)色的區(qū)域,這個區(qū)域就是導(dǎo)航區(qū)域了,敵人可以在這個區(qū)域行動

注意:敵人如果掛的有Animator,rootmotion一定打勾,我之前遇到敵人無法移動,找了半天才發(fā)現(xiàn)這里沒勾上

獲得Player
我們可以自定義個腳本來獲得player,這樣算是最節(jié)約效能的了(比起大范圍的Findtag來說,我也不推薦大量用find來查找,這種方式很耗性能)
我們可以為Player的腳本寫個單例,目的是方便別的腳本能夠很快找到角色,不知道啥是單例就直接看代碼

一般角色之類的,因為游戲里只有一個,所以我們可以用單例聲明這個角色,既然叫單例腳本,意思就是這個腳本不能在場景里出現(xiàn)兩個,貌似這是很基礎(chǔ)的知識了
單例寫完后,怎么在別的腳本里獲得player呢,你可以在別的腳本里寫playerBoyManager.Instance就可以獲得了
自定義一個行為樹腳本,內(nèi)容差不多照抄就行,行為樹必須要符合這個格式,具體為社么這樣寫可以看官方文檔,Sharedxxxxx變量是行為樹插件安裝后會自帶的變量,這個腳本的主要目的就是把sharedValue值返回成player

在之前敵人上添加的節(jié)點里點OPEN,就可以打開行為樹界面

我們可以在參數(shù)界面里設(shè)置一個叫做Player的參數(shù),Type點開,改成GameObject

在Task界面找到剛才自定義的節(jié)點,拖出來連上Entry

此時你運行游戲,你會發(fā)現(xiàn)行為樹的參數(shù)能獲得角色了

當(dāng)玩家在視野里會被敵人跟隨
我們來加點節(jié)點

上圖有兩個新節(jié)點,當(dāng)你加上Within Distance節(jié)點的時候,你會發(fā)現(xiàn)敵人周圍多了個圈,這個圈的意思是,當(dāng)Target(玩家)進入圈內(nèi),就會執(zhí)行右邊的節(jié)點
但是,如何告訴節(jié)點Target是玩家呢,剛才我們不是寫了個自定義節(jié)點叫做獲得Player了,并把Player的GameObject給了一個參數(shù),所以我們按照下圖設(shè)置就可以讓敵人知道Player是誰了

Seek節(jié)點的意思是追角色,也有參數(shù)設(shè)置,具體大家自行研究了,但是需要注意的是,里面有個Target參數(shù),需要指定給player
此時運行游戲,你會發(fā)現(xiàn),當(dāng)你進入?yún)^(qū)域后,敵人會對你緊追不舍,就算你脫離了區(qū)域,敵人依然追你,這個要怎么解決呢
脫戰(zhàn)功能
點擊如圖節(jié)點,設(shè)置Abort Type為Self,再運行下游戲,就會發(fā)現(xiàn)你離開敵人區(qū)域后會脫戰(zhàn)了

雖然很簡單,但是這個是什么意思,這里就要說下Abort Type
這個可以理解成強行打斷Sequence,默認(rèn)是None
為None的時候,也就是不設(shè)置打斷,比如運行到敵人追你,就會一直追,除非追到你否則不會停下來
為Self的時候,會打斷自身,比如檢測范圍的節(jié)點為False時,就會打斷節(jié)點,讓敵人不追你了
Lower Priority,高優(yōu)先級的Sequence為True,會打斷低優(yōu)先級執(zhí)行高優(yōu)先級,什么叫高優(yōu)先級呢,在行為樹里,左邊的節(jié)點比右邊的優(yōu)先級高
Both,當(dāng)然就是上面兩個一起執(zhí)行,即可以打斷自己,也會被高優(yōu)先級打斷
脫戰(zhàn)回到原點
我希望敵人脫戰(zhàn)后可以回到自己的初始地點
創(chuàng)建一個V3變量,并在開始時存儲角色的位置

修改節(jié)點,主要是增加了個Get Local Position節(jié)點,獲得角色的位置

節(jié)點里的參數(shù)設(shè)置中,Target為空,意思就是Self,即自身,然后我們把這個節(jié)點傳遞給StartPos

后面的IDLE節(jié)點意思是掛起,等待角色進入范圍,如果不加IDLE,這個行為樹就運行結(jié)束了,但是此時的節(jié)點有問題,你會發(fā)現(xiàn)程序卡IDLE上了,所以我們進行一些修改和調(diào)試
我們的目的是,敵人沒發(fā)現(xiàn)你時運行IDLE,發(fā)現(xiàn)你后開始SEEK

上面的節(jié)點多加了個Selector節(jié)點,以及將Idle左邊的Sequence改成了Both模式,Selector的意思是,當(dāng)?shù)谝粋€節(jié)點不成立時,會繼續(xù)執(zhí)行下一個,而Sequence設(shè)置成Both,就會不斷檢測角色是否進入?yún)^(qū)域,一旦進入打斷右邊低優(yōu)先級的Idle
攻擊主角
通過上面的內(nèi)容,應(yīng)該對節(jié)點都比較理解了,所以接下來會加快速度直接給答案

補充
如何讓角色移動的時候播放行走動畫?
可以在Animator里面設(shè)置參數(shù)WalkSpeed

給敵人一個腳本,注意需要引用using UnityEngine.AI;

在動畫里設(shè)置一個混合動畫(如果不會找別的教程)

這樣敵人行動起來就可以播放動的動畫了
敵人可能出現(xiàn)莫名其妙的自轉(zhuǎn)?
下圖位置打勾

如果覺得文章不錯,歡迎三連,連的多以后分享更多教程