(本博文可能比較老,如果發現外掛程式運行不起來,那麼可能是外掛程式需要的U3D版,與你現在用著的不一相容而導致)
在使用Unity 的外掛程式中,官方提供的Assets Store中,提供了大量了資源下載,其中有一款,收費外掛程式:Behavior Designer,這是收費的外掛程式;
我讓群友發了一份給我,這裡不作商業應用;
Unity Behavior Designer 外掛程式下載(點擊)
不過這個外掛程式,我在使用的時候,發現了一些問題:某個GameObject(MyPrefabObj)添加了BehaviorTree組件,添加自訂節點,該節並且公開部分欄位;
在BehaviorDesigner視圖的Inspector中設定了該節點的公開欄位值之後,把這個GameObject(MyPrefabObj)設為預投之後;
然後使用代碼:Instantiate方法執行個體該prefab(MyPrefabObj)後,發現,對應的BehaviorTree組件上對應的節點的公開欄位值,又還原成未賦值狀態;
Behavior Designer 的可視化編輯截圖:
可以看到,左邊的列表有好多種節點類類型;
粗略分為以下這幾種:
選擇節點 : SelectorNode; 順序節點 : SequenceNode; 條件節點 : ConditionNode; 並行節點 : ParalleNode; 等待節點 : WaitNode; 開關節點 : ToggleNode; 中繼節點 : InterruptNode(看到這,是否有點想到了:就像是:電路板一樣);
各節點特性:
選擇節點
在子節點中,找一個Success的,就不再往下執行;
for (child in children) if (child.update() == Success) return Success;return Failure;
順序節點
與選擇節點的條件上相反吧,就是中子節點中,找一個Failure的,就不再往下執行了;
除了以上這種特性,比較特殊的:要過了Conditions這關,再會處理Children;
onConditions():for (condition in conditions) if (condition.excute() == Failure) return Failure;return Success;onChildren():for (child in children) if (child.update() == Failure) return Failure;return Success;update:result = onCondition();if (result == Success) return onChildren();return result;
條件節點
也就是上面我們所說的順序節點中的條件節點,具體的返回:Success/Failure的話,得依你自己的判斷而定;
並行節點
最簡單的節點,就是內部所有子節點都會執行一次;不管子節點的傳回值,最終都會返回Success;
等等,看你對自己的節點擴充,與分類的種類而定吧;
等待節點
在指定時間後,就會運行指定nextNode節點;
開關節點
對:中繼節點.enable = !enable控制類;就是不斷的開/關;
中繼節點
只有enable == true時,子節點才會繼續執行,通常使用:WaitNode, ToggleNode來搭配使用;
上篇FSM的,感覺沒啥人想瞭解;
這篇的BT(Behavior Tree)就不詳細解說了,更何況,現在都是把一些閒置時間擠出寫來的;
從簡單的DEMO中學習設計;是比較容易的;
如果從一個比較大的成品去研究,就比較麻煩了;
直接上代碼,自己看去。
BehaviorTestingProject
BehaviorTestingProject_1.1(感謝:artist963 兄,只在原來基礎上最佳化代碼、結構,並放一些BT邏輯封裝成類,方便閱讀、理解)
這個DEMO中,是簡單示範了,BOSS,尋找目標,靠近目標,自動攻擊,與巡邏;
行為樹結構大概是這樣:
像上面的AttackTarget(ActionNode)中,我們完全可以再寫成另一個嵌套的BT去處理;
總之,BT可以應用在,邏輯複雜度很高的系統都可以比較清晰的簡單化;
如:上面的BOSS AI;
或是,任務系統中的自動跑任務;
他就有點像,我們生活中的一些處理事件的邏輯整理,然後按邏輯先後,有條不紊的執行;