C++實(shí)現(xiàn)行為樹(shù)
基本概念
行為樹(shù),英文是Behavior Tree,簡(jiǎn)稱BT,是由行為節(jié)點(diǎn)組成的樹(shù)狀結(jié)構(gòu),每個(gè)節(jié)點(diǎn)的執(zhí)行都有一個(gè)結(jié)果(成功Success,失敗Failure或運(yùn)行Running)。節(jié)點(diǎn)從結(jié)構(gòu)上分為兩類:組合節(jié)點(diǎn)、葉節(jié)點(diǎn),組合節(jié)點(diǎn)才有子節(jié)點(diǎn),即出度可以大于0的節(jié)點(diǎn),葉節(jié)點(diǎn)一般用來(lái)放置執(zhí)行邏輯和條件判斷。
序列(Sequence)節(jié)點(diǎn):組合結(jié)點(diǎn),順序執(zhí)行所有子節(jié)點(diǎn),如果子節(jié)點(diǎn)全部執(zhí)行成功,返回成功。如果某個(gè)子節(jié)點(diǎn)失敗則返回失敗,且不再執(zhí)行下一個(gè)子節(jié)點(diǎn)。
選擇(Selector)結(jié)點(diǎn):組合結(jié)點(diǎn),順序執(zhí)行所有子節(jié)點(diǎn),只要碰到一個(gè)子節(jié)點(diǎn)返回成功,則返回成功,否則繼續(xù)執(zhí)行下一個(gè)。如果子結(jié)點(diǎn)全都執(zhí)行失敗,則返回失敗。(每個(gè)節(jié)點(diǎn)是或關(guān)系)
并行(Parallel)結(jié)點(diǎn):組合結(jié)點(diǎn),并行其下所有子節(jié)點(diǎn),所有節(jié)點(diǎn)成功則返回成功(有任意子節(jié)點(diǎn)失敗則失?。?。(每個(gè)節(jié)點(diǎn)是與關(guān)系)
條件(Condition)節(jié)點(diǎn):葉子結(jié)點(diǎn),根據(jù)條件的比較結(jié)果,返回成功或失敗。
動(dòng)作(Action)節(jié)點(diǎn):葉子結(jié)點(diǎn),根據(jù)動(dòng)作結(jié)果返回成功,失敗,或運(yùn)行。
等待(Wait)節(jié)點(diǎn):葉子節(jié)點(diǎn),當(dāng)指定的時(shí)間過(guò)去后返回成功。
循環(huán)(Loop)節(jié)點(diǎn):葉子節(jié)點(diǎn),循環(huán)執(zhí)行子節(jié)點(diǎn)到指定次數(shù)后返回成功,如果循環(huán)次數(shù)為-1,則無(wú)限循環(huán)。
比如我們要實(shí)現(xiàn)這個(gè)行為:如果碰到主角,打招呼;否則,睡覺(jué)。

通過(guò)Json建立行為樹(shù)
輸入使用Json格式。Json整體是一個(gè)字典,value的類型有以下三種類型:
標(biāo)量(scalar):也就是一個(gè)單獨(dú)的字符串或數(shù)字。
序列(sequence):也就是若干個(gè)相關(guān)的數(shù)據(jù)按照一定順序并列在一起,又叫做數(shù)組(array)或列表(List)。
映射(mapping):也就是一個(gè)key/value對(duì),即字典。這個(gè)就是嵌套形式了,因?yàn)镴son本身就是一個(gè)字典,字典內(nèi)繼續(xù)包含字典。
Json的書(shū)寫規(guī)則如下:
并列的數(shù)據(jù)之間用逗號(hào)(",")分隔。
映射用冒號(hào)(":")表示。
并列數(shù)據(jù)的集合(數(shù)組)用方括號(hào)("[]")表示。
映射的集合(對(duì)象)用大括號(hào)("{}")表示。
下面舉一個(gè)由輸入Json來(lái)構(gòu)建行為樹(shù)的例子,每個(gè)字典就是一個(gè)節(jié)點(diǎn)(Node)。執(zhí)行效果是車輛先播放音樂(lè),然后右轉(zhuǎn),然后停下來(lái)。

1. 節(jié)點(diǎn)定義
1)btNode.h代碼
2)btNode.cpp代碼
2. 生成結(jié)點(diǎn)的工廠類實(shí)現(xiàn)
這里可以不需要用工廠類,因?yàn)槊總€(gè)實(shí)例工廠并沒(méi)有特別的流程,創(chuàng)建節(jié)點(diǎn)的方式都一樣,即包含兩步:1)new一個(gè)指定節(jié)點(diǎn)。2)加載json。但是使用工廠類可以更方便地管理所有的節(jié)點(diǎn)類型。
3. 組合結(jié)點(diǎn)類型
繼承BtNode,是組合結(jié)點(diǎn)類型的基類,如parallel、selector、sequence等需要繼承這個(gè)類,而葉子結(jié)點(diǎn)類型只需要繼承BtNode類。
1)BtGroupNode.h代碼
2)BtGroupNode.cpp代碼
4.?parallel并行節(jié)點(diǎn)
1)BtParallelNode.h代碼
2)BtParallelNode.cpp代碼
5. action動(dòng)作節(jié)點(diǎn)
1)BtActionNode.h代碼
2)BtActionNode.cpp代碼