Unity Behavior Tree的使用

先展示下各個(gè)用法組件

Sequence 與 遍歷下面所有字節(jié)點(diǎn),一直到false,主節(jié)點(diǎn)返回flase

除非全部為true 住節(jié)點(diǎn)返回success


Selector

類似||,只要一個(gè)子節(jié)點(diǎn)為true,主節(jié)點(diǎn)為success


Parallel 類似 Squence但是不按順序來


Parallel Selector 按照優(yōu)先級(jí)遍歷字節(jié)點(diǎn)

只要有一個(gè)子節(jié)點(diǎn)為true 主節(jié)點(diǎn)為success


Random Selector 隨機(jī)選擇一個(gè)字節(jié)點(diǎn)

選中的節(jié)點(diǎn)返回為true 主節(jié)點(diǎn)就是success


Random Sequence 類似第一Squence個(gè)

只不過是隨機(jī)遍歷的


Selector Evaluator 從優(yōu)先級(jí)低到高遍歷節(jié)點(diǎn)

一直到為true的子節(jié)點(diǎn),如果都是false則返回failure


Conditionals 判斷條件


Random Probability 隨機(jī)值返回


Compare Field Value 對(duì)比value是否相等


Has Received Event(是否接收到事件)


Decorators(修飾器)節(jié)點(diǎn)

這種節(jié)點(diǎn)的功能是用來包裝另一個(gè)節(jié)點(diǎn) (只能有一個(gè)子節(jié)點(diǎn))

可以修改子節(jié)點(diǎn)的行為,子節(jié)點(diǎn)發(fā)success ,用這個(gè)可以反過來處理


Conditional Evaluator (條件節(jié)點(diǎn)的評(píng)估) 裝飾節(jié)點(diǎn)

1:reevaluate:條件節(jié)點(diǎn)是否每幀都重新評(píng)估

2:conditionalTask 要被評(píng)估的條件節(jié)點(diǎn),如果被評(píng)估的節(jié)點(diǎn)success,那么就運(yùn)行,如果failure就返回,只評(píng)估一次


Interrupt(打斷)裝飾

觸發(fā)這個(gè),則打斷下方所有子節(jié)點(diǎn),如果沒打斷,則返回子節(jié)點(diǎn)的結(jié)果


Inverter(取反)裝飾節(jié)點(diǎn)

把得到的結(jié)果取反發(fā)給上層


Repeater(重復(fù)/循環(huán))裝飾節(jié)點(diǎn)

子節(jié)點(diǎn)為true就一直循環(huán),直到返回failure


Return Failure (返回失敗)裝飾節(jié)點(diǎn)

如果子節(jié)點(diǎn)不是running,則返回failure


Return Success(返回正確)裝飾節(jié)點(diǎn)

是success或者failure則返回success


Until Success(直到成功)裝飾節(jié)點(diǎn)

同上,反之

是running則返回running


Task Guard(任務(wù)守衛(wèi))裝飾節(jié)點(diǎn)

相當(dāng)于多線程的Lock,并行的時(shí)候會(huì)先后觸發(fā),而不是一起觸發(fā)


Until Failure(直到失敗)裝飾節(jié)點(diǎn)

直到子節(jié)點(diǎn)返回failure,不然就一直執(zhí)行子節(jié)點(diǎn) 類似Repeater


舉個(gè)例子


舉個(gè)栗子

Selector會(huì)判斷下面三個(gè)條件腳本下面的??public override TaskStatus OverrideStatus(TaskStatus stat)的返回值(是繼承Composite,如果繼承Action 就是看OnUpdate的返回值)

如果為 1為failure? 則執(zhí)行2, 2為Failure則執(zhí)行3...? ?只要有一個(gè)為true 主節(jié)點(diǎn)為true

不過即便1為Failure, 1下面的分支還是會(huì)進(jìn)去判斷

此外自定義的方塊可以繼承創(chuàng)建的主類別? 比如Action 以及?Composite那四個(gè)

想在自定義的類別里實(shí)現(xiàn)Selector的功能的話,進(jìn)去復(fù)制到自己的腳本即可



關(guān)于數(shù)值

可以自己定義靜態(tài)類,或者其他腳本獲取

插件帶的共享的值


添加全局變量

添加名稱,選擇類型,最后點(diǎn)擊ADD

例如我下面的index就是自己添加的


但是還是需要在每一個(gè)塊里面獲取到掛在面板上的? BehaviorTree腳本??

就是?behaviorTree = GetComponent<BehaviorTree>(); 這樣的...

然后才能在各個(gè)類里

?var index = behaviorTree.GetVariable("index");

注意Index的類型是ShardVariable 需要轉(zhuǎn)換


behaviour = gameObject.GetComponent<BehaviorTree>();

? ? ? ? var index = behaviour.GetVariable("index");? ?//獲取

? ? ? ? Debug.Log("index" + index);

? ? ? ? int ind = 2;

? ? ? ? behaviour.SetVariable("index", (SharedInt)ind); //保存

? ? ? ? index = behaviour.GetVariable("index");

? ? ? ? Debug.Log("index" + index); //確認(rèn)數(shù)值被替換

此外


四種Above類型的說明

面板上的IsInstant可以設(shè)置暫停調(diào)用?


關(guān)于腳本


public可以在點(diǎn)擊塊后,在左邊窗口的Inspector里找到變量

[TaskDescription("文本")] 在Class上方加入這個(gè),可以有塊的說明文本

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容