- 當(dāng)AI足夠復(fù)雜的時(shí)候 我發(fā)現(xiàn)此時(shí)的FMS已經(jīng)被寫成了一片代碼的泥沼骨杂,想要繼續(xù)維護(hù)下去已經(jīng)是很乏力了
-
當(dāng)我們使用Unity自帶的動(dòng)畫狀態(tài)機(jī)系統(tǒng)后,變成了這樣 下圖 ,當(dāng)然你想改也不是不可以或許是個(gè)體力活咕缎,但是我想告訴你,你的隊(duì)友可能在某些動(dòng)畫之中安插了一些 被稱為 動(dòng)畫幀事件 的東西料扰,而這種東西則需要你一個(gè)一個(gè)選中并且查看動(dòng)畫文件是否被更改凭豪,量一旦大了換一個(gè)人接手那就是“不可能實(shí)現(xiàn)的任務(wù)”
基本概念
Composites
這里的"組合" 全名應(yīng)該被成為“組合節(jié)點(diǎn)控制(管理)類目”,顧名思義在此條目下若干個(gè)選項(xiàng)都被稱之為“控制類節(jié)點(diǎn)”晒杈,用以從最高的緯度去規(guī)范行為樹的流程嫂伞。具體細(xì)分為如下幾種
Parallel 并行節(jié)點(diǎn) 此節(jié)點(diǎn)下屬所有節(jié)點(diǎn)將一起進(jìn)行,其中某一個(gè)執(zhí)行返回false 則Parallel節(jié)點(diǎn)返回false
Parallel Selector 并行選擇節(jié)點(diǎn) 此節(jié)點(diǎn)下屬所有節(jié)點(diǎn)只要有一個(gè)返回success拯钻,則Parallel Selector節(jié)點(diǎn)返回success
注意: 以上二節(jié)點(diǎn)都是并行的帖努,也就是說同時(shí)執(zhí)行所有下屬節(jié)點(diǎn)
Proiorty Selector 優(yōu)選選擇節(jié)點(diǎn) 此節(jié)點(diǎn)下屬所有節(jié)點(diǎn)依次執(zhí)行直到返回success
Random Selector 隨機(jī)選擇節(jié)點(diǎn) 此節(jié)點(diǎn)下屬所有節(jié)點(diǎn)隨機(jī)執(zhí)行直到其中某一個(gè)返回success
Ramdom Sequence 隨機(jī)選擇列隊(duì)節(jié)點(diǎn) 此節(jié)點(diǎn)下屬所有節(jié)點(diǎn)隨機(jī)執(zhí)行直到其中一個(gè)返回false
Selector 選擇節(jié)點(diǎn) 此節(jié)點(diǎn)下屬所有節(jié)點(diǎn)依次執(zhí)行直到返回true
Selector Evaluator 計(jì)算選擇節(jié)點(diǎn)(姑且這樣叫把,這個(gè)名詞翻譯的優(yōu)點(diǎn)拗口) 此節(jié)點(diǎn)下屬所有節(jié)點(diǎn)依次執(zhí)行直到返回success粪般,有一種情況使其返回running狀態(tài)并中斷拼余,就是有節(jié)點(diǎn)被打勾了
Sequence 順序節(jié)點(diǎn) 此節(jié)點(diǎn)下屬所有節(jié)點(diǎn)依次執(zhí)行直到返回false
Decorators
裝飾節(jié)點(diǎn)應(yīng)為Composites的分支節(jié)點(diǎn),而裝飾節(jié)點(diǎn)一般用來修飾判斷亩歹,比如這個(gè)修飾可以是 “直到...成功”匙监,“直到...失敗”
Conditional Evaluator 條件計(jì)算節(jié)點(diǎn) 此節(jié)點(diǎn)下屬節(jié)點(diǎn)執(zhí)行直到返回success寡润,有一種情況使其返回running狀態(tài)并中斷,就是有節(jié)點(diǎn)被打勾了
Interrupt 中斷(開關(guān))節(jié)點(diǎn) 此節(jié)點(diǎn)第一次執(zhí)行為true第二次為false
Inverter 逆變節(jié)點(diǎn) 此節(jié)點(diǎn)的子節(jié)點(diǎn)如返回success他可將結(jié)果改為false反之也可
Repeater 重復(fù)節(jié)點(diǎn) 此節(jié)點(diǎn)可設(shè)置該節(jié)點(diǎn)下子節(jié)點(diǎn)重復(fù)執(zhí)行的次數(shù)
Return Failure / Return Success 我就不解釋了
Task Guard Task意為任務(wù)Guard意為守衛(wèi)舅柜,那么這個(gè)節(jié)點(diǎn)是告訴我們可以用他來限定該節(jié)點(diǎn)的子節(jié)點(diǎn)不能同時(shí)被兩項(xiàng)或以上的任務(wù)訪問,換而言之該節(jié)點(diǎn)可以設(shè)置它的子節(jié)點(diǎn)能同時(shí)被幾個(gè)任務(wù)(其余的節(jié)點(diǎn))訪問躲惰,類似于多線程訪問統(tǒng)一資源我們所使用的Lock致份。
Until Fuilure / Until Success 直到...返回false/知道...返回Success 這兩項(xiàng)我想也沒有必要說明了,但看字面上的意思足夠說明一切了础拨。
Actions
動(dòng)作或行為氮块,如“攻擊” “追逐”
Action有三大類,第一類為基礎(chǔ)的API诡宗,第二類為基本的Monobehavior操作 如Animator滔蝉,Animation,Behavior 等等塔沃,第三類為輔助API 都是使用反射處理蝠引,當(dāng)然這個(gè)大類隱含著性能的損耗要謹(jǐn)慎使用
此處僅選必要的API解釋,其余的相信你可以看懂
Behavior Tree Reference 此節(jié)點(diǎn)允許此節(jié)點(diǎn)的腳本中重寫GetExternalBehaviors方法蛀柴,也就是你可以在運(yùn)行時(shí)指定一個(gè)行為樹在當(dāng)前節(jié)點(diǎn)下運(yùn)行螃概!(動(dòng)態(tài)指定行為樹)
Preform Interuption 此節(jié)點(diǎn)允許用戶中斷在節(jié)點(diǎn)列表中添加的任務(wù)(可以有很多任務(wù))
Restart Behavior Tree 重啟行為樹
Stop Behavior Tree 終止行為樹
另外 Action 一般我們程序需要擴(kuò)展給策劃配置 后文將提到如何自行擴(kuò)展Action。
Conditionals
用于條件對(duì)比鸽疾,例如 “是否為空” “是否是處于某狀態(tài)” “是否接收到消息” “是否等于某數(shù)值”
作為行為樹組建中最容易理解的Conditionals吊洼,在其基本API中大多以 "Is has XXX" 開頭,顧名思義即可
如何擴(kuò)展(程序)
創(chuàng)建一個(gè)自定義行為(Action)或是節(jié)點(diǎn)
相關(guān)文檔
http://www.opsive.com/assets/BehaviorDesigner/documentation.php?id=5
使用運(yùn)行時(shí)(Runtime)設(shè)置的數(shù)值
在編輯器中設(shè)置的數(shù)值有兩種一種是在使用功能性節(jié)點(diǎn)的時(shí)候節(jié)點(diǎn)中需要預(yù)設(shè)的數(shù)值制肮,另一種是全局可訪問到的數(shù)值
添加wait節(jié)點(diǎn)的暫停時(shí)間
添加全局可訪問的數(shù)值
非運(yùn)行時(shí)可以使用剛才設(shè)置的float數(shù)值
當(dāng)然也可使用全局?jǐn)?shù)值
說完了使用編輯器訪問數(shù)值現(xiàn)在該使用運(yùn)行時(shí)動(dòng)態(tài)獲取這些數(shù)值了冒窍,代碼很簡單
相關(guān)文檔
http://www.opsive.com/assets/BehaviorDesigner/documentation.php?id=54