如何用行为树开发游戏AI以及任务系统?
AI在游戲開發過程中一直都是被反復修改的一部分。隨著游戲內容越來越豐富,難免會需要調整AI行為,所以我長久以來一直想有一個完全交給策劃同志們編輯的游戲AI編輯器。
游戲AI自定義
我們考慮一下游戲實際邏輯AI,比如有這樣一些需求:角色需要找尋一個自己能打得過的野怪并且避讓某些打不過的大型野怪,或角色達到一定等級做一些特定行為等。這些行為加條件的組合肯定是依賴于角色本身已經實現了一些基本的功能,例如行走到指定位置,播放指定動作,尋路等,這些邏輯需要提前都實現好,這里不做說明。然后留給AI中的邏輯去調用合適的用戶api。
還有就是用狀態機還是行為樹去實現?我感覺行為樹更好一些。狀態機在完成需求固定且狀態比較少的時候可以用一下,一旦出現狀態添加或刪除就需要大動干戈了,而行為樹的擴展性就很出色了。行為樹大家能找到很多資料,大致上的內容就不說了。主要說一下這里的一些區別吧。
?
我這里把節點分成這4類:
·葉節點:可執行狀態的節點,也就是主要的行為邏輯都需要在這個節點下實現。
另外3類節點是控制型節點:
?
- ·順序節點:順序執行其子節點。
- ·選擇節點:通過計算子節點的權重隨機選擇一個節點。
- ·并發節點:執行所有自己點。
這4類節點本身都有進入條件的檢測。
為了更好的配合策劃開發,我用XLua來調用游戲中的用戶api。這是葉節點的XLua文件,控制節點的XLua文件也類似只是沒有 update()和trigger()。腳本是外部調用的,首先會執行detect()判斷這個節點的進入條件,當返回true的時候才會調用enter()。
·function detect()--節點的進入條件
·function enter()--進入后調用
·function update()--節點進行中(只有葉節點才有)
·function trigger()--外部事件觸發后響應 (只有葉節點才有)
·function exit()--退出節點
?
假如現在有這個需求:
有一個人每天上班一直工作到下班,下班的時候會有兩種選擇:直接回家或者去女友家,去女友家如果沒有禮物需要先去禮品店購買一些禮物,有了禮物之后再去女友家與女友約會。這樣一天就結束了。
先來看看這棵行為樹:
?
有了以上的樹形圖之后,我們打開Window-NodeEditor在編輯器下構造如下結構:
?
這棵樹結構最后導出json格式用于構造節點。
這棵樹的執行效果是這樣的:
?
使用AI行為樹開發任務系統
任務系統在游戲開發過程中伴隨著DEMO版本一直修改到RELEASE版本,無時無刻都在修改,時刻反復經受著策劃和運營的折磨。無數的慘痛教訓使我痛定思痛,放棄傳統的硬編碼方式轉而尋求一種動態的實現方式,一種設計優秀的任務系統在這個過程中能讓程序員獨善其身,任憑風浪起,穩坐釣魚船。這就是我想說的行為樹任務設計思想。
下面我們來簡單描述一下任務系統,任務系統一般可以分成這3個部分:
·可執行任務的條件,例如:角色等級,職業限制等等。這部分在detect中判定。
·任務執行過程中的細節,此處能拆分出若干項行為。
·任務的完成條件,有些任務是服務器判斷完成條件的(殺怪等), 有些是客戶端判斷完成條件的(和NPC完成一次對話等)。
任務可以拆分出的各種細節,每一個可以抽象成行為樹的行為節點,這樣根據任務的具體細節設計出一棵行為樹。各個行為節點中的內嵌腳本可以交于策劃填寫具體的邏輯。程序部分的工作主要是實現角色的基本邏輯單元以及一些黑板功能,二手手游買號邏輯單元之間的組合交織就通過腳本實現。原本繁雜易修改的邏輯脫離出硬編碼方式,這樣的好處顯而易見了。
我們看一下這個簡單的例子:
有一個簡單的任務:尋找NPC,然后和NPC對話至完成對話,并完成該任務。
這個任務的具體細節有3步,第一步:尋路找到地圖上的NPC,第二步:與該NPC對話,第三步:完成對話。這3步之間的執行順序是依次先后執行的,因此我們設計出這棵行為樹結構如下圖:
這個任務的3步細節可以放在這棵樹的三個順序執行節點上,依次執行。
第一步尋路至NPC的XLua腳本如下:
?
這個腳本執行了角色在地圖上尋找該NPC的操作,注意這一個行為是個持續性的動作,在trigger方法中監聽了外部事件“MoveFinish”即角色尋路完成的事件,在腳本監聽到事件之后尋路NPC的行為完成,轉而執行接下來的行為,接下來就是第二步。
?
第二步的腳本作用是打開與該NPC對話的邏輯,同樣的需要監聽DialogFinish事件,最后是第三步完成對話。
?
NotifyServer方法是和服務器定義的通知消息,作用是告知服務器這個任務已經做完,服務器得知消息后處理后續的游戲邏輯。
這樣整個簡單的任務流程就走完了,通過行為樹的設計方式實現任務系統,可以說是非常簡潔易維護的。行為樹任務系統在遇到非常復雜的任務細節時依然能夠清晰的表達出來,關鍵之處在于任務細節能通過了行為節點很好的抽象封裝起來。
總結
以上是生活随笔為你收集整理的如何用行为树开发游戏AI以及任务系统?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一种基于游戏引擎的AR模式探讨(上)
- 下一篇: 虚幻引擎学习之路:粒子系统篇(二)