1. 程式人生 > >UE4AI(行為樹)

UE4AI(行為樹)

AI的生成方式比較多,單純用藍圖也可以構成複雜的AI,而行為樹算是AI的規範化,也比較直觀明朗,因此這裡主要講解行為樹的使用,先說一下其中幾個簡單的概念。

AIController->和playcontroller一樣,只不過AIController負責管理的是AI,也稱AI控制器。

Blackboard->黑板,就跟以前上學時用的黑板一樣,他的作用就是用來標記關鍵值,為AI儲存或者提取相關記憶。

Behavior Tree->行為樹,從黑板裡讀取關鍵值,做出決定和執行。

Animation BluePrints->動畫藍圖 配合行為樹呼叫,之後詳細講。

Task->任務 

Services ->常用於檢查和更新黑板.

(注:假如你使用的是C++來建立任務服務的話,記得給黑板資料做初始化,這樣在C++上做資料型別的判斷之類的才不會為空,導致判斷失誤,如圖:)

NavMeshBoundsVolume->導航

就選官方的第三人稱模板吧,邏輯為隨機選取目標點進行移動。

第一步,拉出NavMeshBoundsVolume,導航網格,按下P鍵可以看到場景變成綠色,證明構建成功,圖示中的LinkeProxy表示連線跳躍,Modifier表示修正,具體用法可以自己實驗。

第二步,建立AIPawn,AIController以及行為樹和黑板,任務Task等,(Task的建立是由藍圖繼承Task類建立的,其他的右鍵建立)為了方便我把檔案放一起。

在AIController跑起行為樹,並將自己建立的AIController替換到要執行的AI上。

黑板裡面增加一個變數TargetLoc,用來儲存AI移動的目標座標,這裡就只做AI隨機行走。

Task(Idle)裡面的設定,藍圖如圖內解釋,記得最後要執行完成函式,變數Idle是用來儲存要移動的目標點座標,儲存進黑板裡剛剛設定的變數TargetLoc,在行為樹裡用來給其他函式進行呼叫。

關於行為樹裡面的設定

這裡說下兩個節點

Selector 從左到右在其子項中執行,直到其中一個成功才返回。

Sequence 從左到右在其子項中執行,直到其中一個失敗返回。

這樣行為樹的意思就是執行下來從左往右,先Idle執行隨機目標點的儲存,然後等待5S,接著進行MoveTo移動,MoveTo函式的座標點呼叫使用的就是黑板裡剛儲存的TargetLoc

行為樹裡也封裝了許多有用的函式,包括EQS環境查詢也可以在這裡使用,我個人的習慣是在AIPlayControl類更新狀態,行為樹開一個任務時刻進行查詢和標記更新,再執行邏輯任務。

順便附上剛好開著的某個專案的AI行為樹片段:

作用邏輯為:判斷當下是否為攻擊狀態,如果不是,進入如圖分支,並從左往右執行,左邊第一個先執行隨機狀態,因為selector執行完一個後必然會重新輪迴,所以會回到上一步,讀取當前隨機狀態為何,從而再進入對應的分支任務中,當分支任務完成時,標記為finish狀態,再回到第一個,重新隨機AI狀態,如此迴圈。

簡單的Demo完成了,接著就去場景跑吧。