項目說明
本行為樹的代碼使用Lua編寫,所有的內容也建立的Lua的基礎語法之上 因為公司項目需求,需要一套Lua的行為樹代碼,所以嘗試從飢荒中抽離了行為樹相關的代碼。絕大多數節點行為與飢荒中相同,不過部分節點因為也許需求也有部分變動
通用說明
行為樹狀態基本分為4種 READY:准備狀態,節點還沒有被調用過。或者已經調用結束被Reset之后的狀態 RUNNING:正在運行的狀態,通常父節點會等待子節點Runing結束才會將自己的狀態標示為結束,當然部分節點不會理會子節點的Runing狀態 SUCCESS:運行成功 FAILED:運行失敗 絕大部分節點都有對應的中文名字,不過部分節點我也不知道怎么翻譯 行為樹會有被打斷的情況,被打斷時。子節點的Reset函數會被調用。必要的情況下重寫Reset函數可以處理被打斷的情況 行為樹在某些情況下也會被暫停。這棵樹中留下相關的暫停(Suspend)與重啟(Restart)函數。需要樹被暫停的時候外部調用,這個方法內部會將對應的方法傳播到每一個節點之中
節點說明
BehaviourTree
樹節點,主要用於子節點的調用,狀態保存等。沒有實際的業務功能
BehaviourNode
所有節點的父節點,沒有實際的業務意義,主要是維護了各種基礎狀態的方法
DecoratorNode(裝飾節點)
沒有實際的業務意義,不過通常是只有一個子節點的節點的父類
ConditionNode(判定節點)
創建這個節點的時候傳入一個能夠獲取判定值的方法,這個節點會根據運行到這個節點時,傳入方法的調用后返回的值,改變當前節點的狀態。nil 或者 false 轉換為FAILED,否則轉換為SUCCESS
ConditionWaitNode(條件等待節點)
與判定基本相同。不同的是在原本會判定為FAILED的情況下判定為RUNNING
ActionNode(動作節點)
創建這個節點的時候傳入一個函數。當運行到這個節點的時候。會調用這個函數,並且將節點的狀態標示為SUCCESS
WaitNode(等待節點)
創建這個節點時傳入一個時間值。當運行到這個節點時,從開始到時間結束這個節點的狀態會一直是RUNNING。等待時間結束后,節點狀態會修改為SUCCESS。 PS:等待過程中,這個節點會休眠。用於減少性能消耗,其他類似功能節點在編寫時,應該也需要做出適當的休眠
SequenceNode(順序節點)
創建這個節點時,需要傳入一個節點隊列。當運行到這個節點時。他的子節點會一個接一個的運行。如果他的子節點狀態是SUCCESS,那么他會運行下一個;如果他的子節點狀態是RUNNING,那么他會將自身也標識成RUNNING,並且等待節點返回其他結果;如果他的子節點狀態是FAILED,那么他會把自己的狀態標識為FAILED並且直接返回。所有節點都返回結尾為SUCCESS那么他會將自身標識成為SUCCESS並且返回。
SelectorNode(選擇節點)
與順序節點類似,創建時需要傳入一個節點列表,當運行到這個節點時,他的節點會一個接一個的運行。如果他的子節點是SUCCESS,那么他會將自身標識成為SUCCESS並且直接返回;如果他的子節點狀態是RUNNING,那么他會將自身也標識成RUNNING,並且等待節點返回其他結果;如果他的子節點狀態是FAILED,那么他會運行下一個。任何一個節點都沒有返回SUCCESS的情況下,他將會將自身標識成為FAILED並且返回
NotDecorator(取反節點)
創建這個節點的時候需要傳入一個子節點。並且將子節點的運行結果除了RUNNING外顛倒下結果並且返回
FailIfRunningDecorator
創建這個節點的時候需要傳入一個子節點。並且將子節點的除了RUNNING結果以外標示為自己的結果;如果子節點的狀態是RUNNING那么就講自身的狀態標識為FAILED。並且返回
RunningIfFailDecorator
創建這個節點的時候需要傳入一個子節點。並且將子節點的除了FAILED結果以外標示為自己的結果;如果子節點的狀態是FAILED那么就講自身的狀態標識為RUNNING。並且返回
LoopNode(循環節點)
創建這個節點的時候需要傳入一個節點隊列和最多循環的次數。循環節點將嘗試執行N次后將自身標識為SUCCESS后返回結果。運行中的狀態與順序節點的邏輯大體一致,子節點的RUNNING會阻止下一個的運行,子節點的FAILED會中斷運行
RandomNode(隨機節點)
創建這個節點的時候需要傳入一個節點隊列和可以不傳的列表對應的權重。在沒有權重的情況下,所有的子節點完全隨機。在有權重的情況下,子節點會按照權重的設置值來選擇某一個節點來運行,並且將這個節點的運行結果標識為自己的狀態,並且返回。 PS:權重的個數可以與子節點列表的個數不同。權重個數不足的將以1填充,超過的部分會被截斷
ParallelNode(並行節點)
創建這個節點的時候需要傳入一個節點隊列。一個接一個的運行子節點。如果子節點的狀態是FAILED,那么它會將自己標識為FAILED並且直接返回;如果子節點的狀態是SUCCESS或者RUNNING,那么它會運行下一個節點。只有所有的節點都標識為SUCCESS它會將自己的標識為SUCCESS並且返回,否則他會將自己標識為RUNNING。 PS:部分節點(ConditionNode、NotDecorator)會在運行前被強制重啟,用於判定
ParallelNodeAny
與ParallelNode基本相同,唯一不同的地方在於任何一個節點標識為SUCCESS的時候,它就會將自己的狀態標識為SUCCESS並且返回
WhileNode
ParallelNode節點的擴展節點,創建這個節點的時候需要傳入一個可以獲取判定值的方法和一個子節點。當運行到這個節點的時候,需要先做判定,然后在執行后邊的節點。如果判定失敗則直接將自身標識為FAILED並且返回。否則將子節點的狀態標識為自己的狀態並且返回
IfNode
SequenceNode節點的擴展節點。與WhileNode節點基本一致,不同的是,判定的條件只有第一次進入的時候生效,之后的運行將直接運行后邊的節點
