
引擎:CocoCreator2.1.0
語言:TypeScript
Git倉庫地址:https://github.com/superXfx/GameDesignPatterns.git
定義——
行為被定義為層次化的目標(biāo)的集合,其表現(xiàn)為樹形結(jié)構(gòu)。
智能體首先選擇高級(jí)抽象目標(biāo),然后遞歸分解成一個(gè)可以遵照?qǐng)?zhí)行的原子目標(biāo)的集合。
以此實(shí)現(xiàn)原子目標(biāo),最終實(shí)現(xiàn)高級(jí)抽象目標(biāo)。
類圖——

行為樹圖——

類圖看起來比較復(fù)雜~,哈哈,其實(shí)不難,記住幾個(gè)關(guān)鍵單就行。
1、樹形結(jié)構(gòu),使用“組件模式”實(shí)現(xiàn)。
從“行為樹圖”中可以看出,復(fù)合目標(biāo)和子目標(biāo)組成了一個(gè)樹形結(jié)構(gòu)。
think每次根據(jù)權(quán)重(由數(shù)值策劃提供公式)選擇一個(gè)“分支”,一次執(zhí)行完整個(gè)分支下的所有葉節(jié)點(diǎn),即可完成策略——實(shí)際項(xiàng)目中會(huì)有很多層,這里簡(jiǎn)化一下。
2、通過權(quán)重選擇策略,每個(gè)策略都對(duì)應(yīng)一個(gè)繼承自Goal_Evaluator的類,對(duì)應(yīng)其返回權(quán)重的以及設(shè)置目標(biāo)的邏輯。
下面來看看具體實(shí)現(xiàn)
簡(jiǎn)單講,需要做的事情有3個(gè)
1、編寫戰(zhàn)略目標(biāo)

重寫Enter()函數(shù),負(fù)責(zé)插入子目標(biāo)
2、編寫子目標(biāo)
Goal_CheckTriggerState

Goal_FindEmptySlot

Goal_PutTrigger


以上就是策略與子目標(biāo)的實(shí)現(xiàn),主要工作就是在Enter(),與Process(dt)中,在恰當(dāng)?shù)臅r(shí)機(jī)返回目標(biāo)狀態(tài)即可。
3、(用樹形結(jié)構(gòu),即組合模式)組織起來




如圖,Goal_Think類通過每個(gè)策略的Goal_Evaluator類計(jì)算權(quán)重,然后addSubgoal,策略在Enter()中也addSubgoal。
這樣便組成了一個(gè)樹形結(jié)構(gòu),然后通過Process(dt)驅(qū)動(dòng)行為樹運(yùn)行。
擴(kuò)展:
配置化——我的思路是策劃在json表中配置 戰(zhàn)略目標(biāo)以及其對(duì)應(yīng)的子目表“樹”。