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