UE4學習筆記--AI行爲樹架構

虛幻4AI行爲控制採用事件驅動模式,需由行爲樹和黑板配合使用的,行爲樹執行AI邏輯,黑板通過黑板變量來存儲AI數據,
黑板變量的改變事件驅動AI行爲樹的邏輯執行。


一、控制器-行爲樹關聯:

每個AI都有自己的控制器(AIController),AI控制器上有兩個組件負責其行爲:行爲樹組件BehaviorTreeComponent和黑板組件BlackboardComponent,當AI生成時,會在Controller上初始化這兩個組件,執行AI行爲樹。

另外,當前世界所有AI的行爲樹都由世界的AI系統裏的BehaviorTreeManager來管理,BehaviorTreeManager有一個數組ActiveComponents存放世界中所有激活的行爲樹。

AI人物出生時會生成controller,在controller中初始化黑板和行爲樹(AAIController::RunBehaviorTree()),當BehaviorTreeComponent執行StartTree()方法時,會將此行爲樹添加到BehaviorTreeManager的行爲樹數組裏:

BehaviorTreeComponent::ProcessPendingInitialize():
BehaviorTreeComponent::ProcessPendingInitialize():

行爲樹在被添加到Manager的數組中後,BehaviorTreeManager會從根節點按遞歸方式深度優先遍歷整個行爲樹,初始化該行爲樹的所有node節點(BehaviorTreeManager::LoadTree),Manager對行爲樹節點的初始化工作主要爲:
1)設置每個節點的父節點;
2)設置每個節點的執行順序索引;
3)設置每個節點的下一執行節點;
4)設置每個節點在行爲樹中的深度;
5)設置每個節點數據所佔的內存大小。

這樣每個節點初始化並互相關聯後,整個行爲樹也完成了初始化。


二、行爲樹節點設計:

下圖爲虛幻4行爲樹節點的UML圖:

(一)BTNode:

UBTNode類是抽象類,爲所有行爲節點類的基類,主要有以下屬性:
1)ParentNode--父節點;
2)NextExecutionNode--該節點在行爲樹中的下一執行節點;
3)ExecutionIndex --執行序號(深度優先);
4)TreeDepth--節點在行爲樹中的深度;
5)MemoryOffset-- 內存偏移。

這些節點的基本屬性會在行爲樹初始化時由BehaviorTreeManager初始化。

(二)BTCompositeNode:

BTCompositeNode即複合節點,複合節點分爲3類:Selector、Sequence、SimplepParallel

1.Selector :

從左向右依次執行其子節點,當其任意子節點執行成功時停止繼續執行。
如果任意子節點執行成功,Selector節點返回成功;如果所有子節點都執行失敗,Selector節點返回失敗。

Selector節點,執行某一個任務

2.Sequence:

從左向右依次執行其子節點,當其任意子節點執行失敗時停止繼續執行。
如果任意子節點執行失敗,Sequence節點返回失敗;如果所有子節點都執行成功,Sequence節點返回成功。

Sequence節點,執行序列任務

簡單來說,Selector節點即選擇器節點,爲了選擇執行一系列子任務中的某一個而使用,故有一個子節點執行成功即可;Sequence節點爲序列節點,是爲了執行一個序列任務而使用的,所以需要序列中所有任務都執行成功,有一個執行失敗都不行。

3.SimplepParallel:

爲簡單並行節點,通常用來處理併發行爲。運行執行兩個子節點:一個必須爲task節點A,另一個爲一個分支樹B。可以理解爲,如果執行A任務,那麼B也會執行,A是首要任務,B是次要任務。

Simple Parallel節點

 

(三)AuxiliaryNode:

AuxiliaryNode即輔助節點,主要分爲Service(服務)和Decorator(裝飾器)。
輔助節點提供了TickNode方法,也就是說這類節點是可以每幀(或一定時間間隔)都執行的。

1.Service :

Service即服務,行爲樹的Service節點被設計成用來更新AI“知識”的task節點的“後臺”。
Service可以附着在複合節點或者task節點上,當Service節點下面的分支被激活時Service節點會被執行。
但與task節點不同,Service節點不會有任何返回值,也不會直接影響執行流程。
通常,它們通過Tice定期檢查並向黑板中存儲結果。

主要屬性:
1)Interval Tick時間間隔;
2)RandomDeviation Interval的隨機偏差;
3)bCallTickOnSearchStart控制初始時調用TickNode。

Service節點可以附着在複合節點Selector或者Task節點上

 2.Decorate的中斷方式:

Decorate即裝飾器,可以附着在複合節點或者Task節點上:

Decorator節點可以附着在複合節點Selector或者Task節點上

行爲樹中裝飾器主要有2個作用:
1)用作條件判斷;
2)控制行爲樹執行流的打斷和跳轉。

Decorator的ObserverAborts選項值控制其所發揮的作用,

當用作條件判斷時,ObserverAborts值爲None。此時若Decorator節點的判斷條件滿足,則會執行其所附着的複合節點或Task節點,反正則不執行。
另外,Decorator節點還有一個InverseCondition選項,其作用是另判斷條件反轉。
當我們需要自定義裝飾器節點時,需要在節點的CalculateRawConditionValue()裏編寫條件判斷邏輯。

BTDecorator.h

ObserverAborts值不爲None時,可實現中斷正在執行的任務:
1)值爲Self時,當條件不滿足時,可以中斷所在節點的任務和子任務,執行比所在節點優先級更低的任務和子任務;
2)值爲LowPriority時,當條件滿足時,可以中斷比所在節點優先級更低的任務和子任務,執行所在節點的任務和子任務;
3)值爲Both時所在節點和低優先級節點都會被中斷。

需要注意,Decorator節點的中斷模式受其父節點CompositeNode影響,CompositeNode包括Selector、Sequence、SimplepParallel,這些節點裏提供了接口爲Decorator返回中斷模式:

BTCompositeNode.h

CanAbortLowerPriority() 默認true
CanAbortSelf() 默認true

子類中重寫了該方法:

Selector:  CanAbortLowerPriority() true   CanAbortSelf() true

Sequence:  CanAbortLowerPriority() false   CanAbortSelf() true

SimpleParallel:  CanAbortLowerPriority() false   CanAbortSelf() false

1)當父節點爲Selector節點時,既能中斷自己(Self),也能中斷優先級更低的任務(LowPriority);
2)當父節點爲Sequence節點時,只能中斷自己(Self),不能中斷優先級更低的任務(LowPriority)。

之所以不讓Sequence中斷優先級更低的任務,我的理解是因爲如果從後面節點跳轉到前面節點這樣就破壞了sequence的執行順序,違背了Sequence的設計初衷。

父節點爲Selector的裝飾節點的中斷方式

 

父節點爲Sequence的裝飾節點的中斷方式

 

父節點爲Sequence,中斷方式爲Self時,若條件不滿足,會從Task1跳出

 

父節點爲Selector,中斷方式爲Self時,若條件不滿足,會從Task1跳出

 

父節點爲Selector,中斷方式爲LowPriority時,若條件滿足,會從其他節點跳轉到Task1

 

父節點爲Selector,中斷方式爲Both時,若條件不滿足,會從Task1跳出;若條件滿足,會從其他節點跳轉到Task1


(四)BTTaskNode:


TaskNode節點是行爲樹的葉子節點,用於執行具體的實際行爲。主要提供以下接口:

1)ExecuteTask():執行該任務,返回Succeeded, Failed 或者 InProgress,
如果返回的是InProgress,使用FinishLatentTask()方法。

2)AbortTask():中斷任務,返回值爲Aborted或InProgress,
如果返回的是InProgress,使用FinishLatentAbort()方法。

 

 

小結:
1)AI控制器擁有行爲樹和黑板組件,行爲樹和黑板配合使用;
2)BehaviorTreeManager統一管理世界所有AI的行爲樹;
3)行爲樹初始化按遞歸方式深度優先遍歷整棵樹;
4)Selector從左往右執行其子節點,直到一個達成,則 Select 達成並返回上層,否則失敗並返回上層;
5)Sequence從左往右執行其子節點,直到一個失敗,則 Sequence 失敗並返回上層,否則達成並返回上層;
6)SimplepParallel通常用來處理併發行爲,運行執行兩個子節點:一個首要任務,一個次要任務;
7)Service和Decorator都可以附着在複合節點或者Task節點上;
8)Service節點不會有任何返回值,也不會直接影響執行流程;
9)Decorator節點可用於條件判斷或者控制行爲樹執行流的打斷和跳轉;
10)ObserverAborts值爲Self時,當條件不滿足時,可以中斷所在節點的任務和子任務,執行比所在節點優先級更低的任務和子任務;
11)ObserverAborts值爲LowPriority時,當條件滿足時,可以中斷比所在節點優先級更低的任務和子任務,執行所在節點的任務和子任務;
12)ObserverAborts值爲Both時所在節點和低優先級節點都會被中斷;
13)當父節點爲Selector節點時,Decorator既能中斷自己(Self),也能中斷優先級更低的任務(LowPriority);
14)當父節點爲Sequence節點時,Decorator只能中斷自己(Self),不能中斷優先級更低的任務(LowPriority);
15)BTCompositeNode保存了身上所有的Service節點,以及所有的Children節點,Children節點包含CompositeNode\TaskNode\Decorate;
16)TaskNode必爲葉子節點。

 

 

以上。

 


 

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