關於行為樹的基礎概念


行為樹下,允許有平行的任務,這個任務可能是個狀態機,多個狀態機可以平行執行。在復雜的應用情景下,行為樹的實現要比狀態機簡單。

從名字上看,behaviour tree,首先是個tree,這樣就會有node,整棵tree代表一系列的組合。其實可以想象火車編組站,從北京始發的車,每到達一個城市,這個城市就是一個node,通過走不同的node,到達了不同的地方,也就提供了不同的功能。每幀更新不會都遍歷一次整棵樹,而是只更新當前正在進行處理的節點即可。

NodeCanvas是先實現了一個圖(Graph)的數據結構,里面定義了節點,連接等對象。行為樹是圖的一個子類,行為樹上的節點是圖里節點的子類。

每個節點的狀態定義了5種:

Failure = 0,
Success = 1,
Running = 2,
Resting = 3,
Error = 4,

從名字上來看,分別告訴父節點,自己執行的結果是失敗,成功還是沒執行完,或者正在重置狀態,或者出錯了。

行為樹上節點的類型有:

三大類,分別是Composite,Decorator,Leaf。 是不是所有的行為樹都必須實現這幾類節點呢?

從名字上來看,

Composite定義了執行框架,最簡單的就是Sequence,序列執行的節點流,如果一個節點執行失敗,就返回,其余節點就不再執行,顯然這種節點,對於完整性要求的事務非常合適。

 

和Sequence相似正好相反的是 Selector,這種框架是,當子節點只要有一個成功,就返回,其余節點不再執行。所以說,sequence是對所有子節點執行的and操作,selector是對所有子節點執行or操作。比如,你下班回家,准備進房間的時候,發現門鎖着(一個節點,檢查門是否鎖着,鎖着意味着進入失敗),拿出一把鑰匙(如果找到的話就成功),然后就可以進房間了,當然這個過程還有很多條件,比如,當前的鑰匙不對,需要再試其他鑰匙。

 

Decorator提供了轉接功能,只能有一個子節點。負責對子節點的輸出結果進行二次加工,再返回到父節點。例如子節點計算一個值,當這個值在什么區間內返回什么,超過區間返回別的。這種轉接口就多了,比如總是返回true,或者總是返回false

leaf定義了具體的行為,也是承載主要功能的節點,不能有子節點。包括子樹節點SubTree,單次行為節點Action,條件節點Condition,狀態機節點FSM,激活的狀態Enable/Disable,根節點轉移RootSwitch等。最簡單的實現,就是行走功能節點,驅動玩家在場景中行走。其實葉節點可以認為是函數,而composite和decorator就是調用這些函數的地方。

 

參考:

http://www.gamasutra.com/blogs/ChrisSimpson/20140717/221339/Behavior_trees_for_AI_How_they_work.php

關於決策樹和行為樹的對比:

http://gamedev.stackexchange.com/questions/51693/decision-tree-vs-behavior-tree

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM