天天看點

Unreal Engine 4 C++ AI 簡單巡邏BehaviorTree的建構Unreal Engine 4 C++ AI 簡單巡邏BehaviorTree的建構

  • Unreal Engine 4 C AI 簡單巡邏BehaviorTree的建構
    • 行為樹BehaviorTree介紹
    • 行為樹BehaviorTree詳解

Unreal Engine 4 C++ AI 簡單巡邏BehaviorTree的建構

好記性不如爛筆頭啊,還是記錄一下!

1.行為樹(BehaviorTree)介紹

我們來了解下一個完整行為樹(BehaviourTree)是什麼樣子:

Unreal Engine 4 C++ AI 簡單巡邏BehaviorTree的建構Unreal Engine 4 C++ AI 簡單巡邏BehaviorTree的建構

這個行為樹(BehaviourTree)都幹了些什麼?他做了這些事情:

  1. 平時按照固定路線巡邏
  2. 發現玩家之後,追蹤玩家
  3. 拾取玩家視野之後,繼續追蹤最後一次看見的位置幾秒,之後放棄
  4. 放棄之後,繼續按照原路線巡邏
  5. 如果聽到聲音,警惕地向聲音發生處張望幾秒
  6. 張望之後如果沒有發現玩家,繼續巡邏

想要看懂AI的BehaviourTree,首先要知道幾個node的概念:

  1. 灰色的node名為composite,是控制樹走向的node
    • Selector從左到右周遊他的子樹,直到一個樹傳回True時停止
    • Sequence從左到右周遊他的子樹,直到一個樹傳回False時停止
  2. 藍色的node是decorator,必須内嵌在composite之中,是控制子樹是否執行的判斷代碼(通過傳回True和False)

    decorator比較複雜,這裡我們隻關心他之中的ObserverAbort字段ObserverAbort可以是None,Self,LowPriority和Both

    • None時,如果decorator判定通過,就執行子樹
    • Self時,如果decorator判定通過,就先停止所有正在執行的Task再執行子樹
    • LowPriority時,如果decorator判定通過,就執行子樹,并且不執行其右邊的所有子樹
    • Both就是Self和LowPriority的結合了*
  3. 紫色的node是task,是AI的行為,是Blueprint代碼或者C++代碼,比如這裡的MoveTo就是内建在BehaviourTree裡的Task,而Find a waypoint就是我們在C++裡邊寫的自定義Task,完成一些更加複雜和特殊化的任務

1.行為樹(BehaviorTree)詳解

Unreal Engine 4 C++ AI 簡單巡邏BehaviorTree的建構Unreal Engine 4 C++ AI 簡單巡邏BehaviorTree的建構

我們再次看看這個BehaviourTree,從Root結點開始,首先進入一個Selector,根據Selector的特性他會從最左邊的子樹執行

Unreal Engine 4 C++ AI 簡單巡邏BehaviorTree的建構Unreal Engine 4 C++ AI 簡單巡邏BehaviorTree的建構
  1. Selector下邊第一棵子樹,先通過通路Blackboard判斷是否看到了target(玩家),如果沒有,這個樹傳回False,根據Selector的性質,進入第二個子樹
  2. 如返在Blackboard中發現target字段不為null,則說明發現了玩家,進入子樹判斷是否知道玩家位置(其實一定是知道的。。。),最後進入MoveTo的Task,通過與Navigation尋路系統共同工作,AI将向玩家移動
Unreal Engine 4 C++ AI 簡單巡邏BehaviorTree的建構Unreal Engine 4 C++ AI 簡單巡邏BehaviorTree的建構
  1. 第二子樹通過通路Blackboard判斷是否聽到了聲音,如果沒有,傳回False,繼續第三子樹
  2. 如果傳回True,說明在Blackboard中ishear字段為True,則執行子樹,子樹是一個Sequence,是以AI會先看相聲音的方向,之後wait幾秒鐘
Unreal Engine 4 C++ AI 簡單巡邏BehaviorTree的建構Unreal Engine 4 C++ AI 簡單巡邏BehaviorTree的建構
  1. AI大部分時間都是在執行第三子樹(巡邏),第三子樹通過通路Blackboard判斷這個AI是不是巡邏兵,如果是,就進入子樹的巡邏邏輯,如不是,傳回False,AI不動
  2. 如果AI是巡邏兵,進入子樹,子樹是一個Sequence,于是AI先發呆wait幾秒(比較真實),之後執行我們自建的Find a waypoint代碼,在Find a waypoint中,我們會找到一個waypoint對象,并把他指派到Blackboard中,找到waypoint之後,AI判斷是否有一個waypoint(是一定會有的,這裡是為了規範再判斷一次),有的話,走向waypoint,達到巡邏的效果。

這裡有幾點不易了解的是:

  1. BehaviourTree是每幀都執行的,而類似MoveTo一類的Task執行都是需要時間的,是以在Task執行的十幾秒中,每次執行BehaviourTree,最後都會走到一樣的Task之中。每次執行Task并不能直接完成任務,每次都是完成了Task中的一小點,通過每次的積累,最後完全完成Task。
  2. 在執行一個Task中,發生了突發情況(比如巡邏時發現了玩家),我們會把target設定為非null的值,這是Tree會走到MoveTo那個分支,但是AI并不會直接就去追玩家,因為上一幀的巡邏Task還沒跑完,是以一定會先跑完之前的Task再跑這次的Task。
  3. 如果突發事件一定要立即執行,可以在decorator裡加上Self的字段,這樣一旦進入了這個decorator,之前的Task就全部廢棄,立即執行新Task。
  4. 圖中的第一第二子樹都是Both,一是為了立即中斷巡邏進行反應,而是為了不斷重新整理MoveTo的位置,達到緊緊追蹤玩家的效果。

繼續閱讀