行爲樹的概念以及在遊戲中的應用

1.行爲樹的概念

行爲樹(behavior tree)是一種樹狀的數據結構,樹上的每一個節點都是一個行爲(節點必須包含函數)。每次調用會從根節點開始遍歷,通過檢查行爲的執行狀態來執行不同的節點。行爲樹也是一種邏輯模型,概念最早來源halo(光暈)這款遊戲裏的ai控制結構,它通過樹形結構來選擇當前環境下應該做出的具體行爲。由於這種控制結構在配置、調試、複用之上的便利,行爲樹的使用也逐漸成爲了現在遊戲的主流AI配置方式。

2.行爲樹的示例圖

3.行爲樹的節點類型

節點返回值:每個類型的節點均需要返回true/false/running,來向父節點報告執行成功/失敗/進行中,返回值用於控制整棵樹中節點的執行順序。

節點類型:節點根據作用可分爲4種類型(其中有的可省略):組合節點,動作節點,裝飾節點,條件節點。

3.1 組合節點(Composite Node,必選)

組合節點不執行具體功能任務,只處理子節點訪問邏輯,按組合性質還可以細分爲以下3種,並且可以根據需求進行擴展。

3.1.1 順序節點(Sequence Node)
順序節點(Sequence),它從左向右依次執行所有節點,只要節點返回true,就繼續執行後續節點,當一個節點返回false或 Running時,停止執行後續節點。向父節點返回 false 或 Running,只有當所有節點都返回 true 時,才向父節點返回 true。這種性質和與門(AND)是一致的。次序節點有很多的用處,其中最常用的做法是 執行一連串有前後依存關係的行爲,其中一個的失敗必然導致後續的動作沒有進行的意義。

3.1.2 選擇節點(Selector Node)

選擇節點遍歷方式爲從左到右依次執行所有子節點,只要節點返回 false,就繼續執行後續節點,直到一個節點返true或Running爲止,停止執行後續節點。如果有一個節點返回true或Running則向父節點返回true或Running。否則向父節點返回 false。選擇節點其實可以被理解爲一個或門(OR)。它的主要作用在於它可以用來表示一個行爲的多種方式,從最高優先級到最低,任何一個方式的成功都會讓這個動作成功。

3.1.3 平行節點(Parallel Node)

平行節點每次執行所有節點,直到一個節點返回false或者全部返回true爲止,此時並行節點向父節點返回false或者 true,並終執行其他所有節點。否則至少有一個節點處於 Running 狀態,則執行完所有節點向父節點返回Running。
 

3.2 動作節點(Action Node,必選,葉節點)

動作節點執行具體的功能任務,必須爲葉節點,不可省略,需要定製。

3.3 裝飾節點(Decorator Node,可選)

裝飾節點根據需求是可省略的,其不能爲葉節點,且只能有一個子節點,子節點的類型必須爲動作節點;裝飾節點將它的子節點執行後返回的結果做額外處理後(比如結果取反,或根據需要做其他處理),再返回給它的父節點。修飾節點常用的幾個類型如下:
Inverter 對子節點執行結果取反
Repeater 重複執行子節點 N 次
Return true 執行到此節點返回失敗
Return false 執行到此節點返回成功
Unitl false 直到失敗,一直執行子節點
Until true 直到成功,一直執行子節點

3.4 條件節點(Condition Node,可選,葉節點)

條件節點必須爲葉節點,需要定製,只做條件判斷,不執行實際功能,可根據需求省略。

通過上述的各種節點幾乎可以實現所有的流程控制:if, while, and, or,not, counter, time, random, weight random,

行爲樹的節點可根據遊戲的需求自行設計,靈活增加或減少。

4.行爲樹的驅動方式

以手遊的戰鬥場景應用行爲樹爲例,行爲樹在戰鬥循環中創建併發起對根節點的訪問。每間隔數幀執行一次,以60幀率爲例,通常2-8幀執行一次。如果執行間隔過小,則行爲樹執行會多佔用cpu。所以在標準行爲樹模型裏面,如何動態的選擇執行間隔是優化的重點。

5.行爲樹的優點

5.1 靜態性
靜態性直接帶來的好處就是整棵樹的規劃無需再運行時動態調整,大大方便設計人員和編程人員,並且減少bug,同時這也爲很多優化帶來方便。

5.2 直觀性
行爲樹可以方便地把複雜的AI知識條目組織得非常直觀。
默認的組合節點處理子節點的迭代方式就像是處理一個預設優先策略隊列,也非常符合人類的正常思考模式:先最優再次優。
此外,行爲樹編輯器對優秀的程序員來說也是唾手可得。

5.3 複用性
各種節點,包括葉子節點,可複用性都極高。

5.4 擴展性
可以容易地爲項目量身定做新的組合節點或修飾節點。還可以積累一個項目相關的節點庫,長遠來說非常有價值。

6.行爲樹的實現

重點實現3個模塊:

6.1 行爲樹管理類(1個,由戰鬥循環中創建,作用是新建行爲樹,發起對根節點訪問)

6.2 組合節點類(3-6個)

6.3 動作節點類(大量)

參考騰訊開源項目行爲樹示例:https://github.com/Tencent/behaviac

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章