AI角色
角色控制器
AI角色必須要一個角色控制器
角色控制器最基本只需要執行行為樹,在EventOnPossess后runBehaviorTree
如果要的是一個角色,可以創建一個Character,在類默認設置中可以找到
Pawn->AIControllerClass,在這里設置AI操控模式和AI控制器類(角色自帶移動組件,否則move to行為不起作用)
行為樹
行為樹是大腦,執行邏輯,數據存儲在黑板,所以創建行為樹同時也要創建黑板
設置AI的行為,判斷,分支Selector,執行Task,順序Sequence
根節點往下第一個只能接基礎3個節點,一般選Sequence或Selector
在Selector上可以套裝飾器(Decorator)或者服務(Service)
裝飾器:根據邏輯判斷當前節點是否執行
服務:當運行到當前節點的時候執行服務內的邏輯
服務
一個隨機找點的服務:
首先在行為樹界面最上方新建一個服務
重寫一個EventReceiveTickAI,這里簡單找個三維向量賦值給黑板
新建一個黑板變量
?使用Service:在行為樹節點上右鍵選中想要的服務即可
?裝飾器
最經常使用的就是使用黑板值來判斷是否執行該節點
在節點上右鍵選擇要使用的BlackBorad
?然后單機藍色的框(裝飾器),在右側面板上可以指定具體的黑板變量
這里選擇變量hasPlayer,當IsSet(設置有值或者為true)就執行
行為Task
?具體的執行節點,同時也是行為樹的最末端節點,
創建自定義Task:
在行為樹面板頂部選擇NewTask
?在Task中重寫EventReceiveExecuteAI,記得一定執行FinishExecute
使用:直接拉出來選擇要執行的Task就行
黑板
負責記錄AI行為所需的數據,可以是任意類型數據
對黑板數據的讀取和修改跟普通的藍圖類不同
設置變量
需要先創建一個類型為BlackBoardKeySelector變量,再將變量設置為黑板值
比如設置一個在黑板中的三維向量變量
?
?獲取變量
EQS
代替大部分常用的服務和Task,例如找點移動等
創建
進入,根節點往下拉可以看到有很多可以執行的節點
例如隨機找點
可以選擇Points下的各種類型(生成不同形狀的查找范圍)
可以在右側面板設置生成點的范圍和密度數量等
在這個節點上可以套額外的限制
比如給一個角度限制
在節點上右鍵AddTest選擇dot(余弦)
?單擊dot可以選擇給生成的點打分或篩選
打分可以在后面選點時參與,篩選則直接去除
我這里選擇只打分,并且只判斷平面,反向打分Inverse(這樣在身后的分最高)
判斷路徑是否可到達
AddTest->PathFinding
使用
完成的EQS可以直接在行為樹上使用,如作為Service套在節點上
或作為節點執行
選中節點同時在右側面板指定要執行的EQS類即可
中斷節點
當角色看到玩家或者其他的判斷條件需要我們放棄當前的操作時(比如moveTo,移動到一半直接去攻擊玩家之類的)
需要在分支或節點上添加一個裝飾器(或現有的可以滿足需求也可以)
在右側面板找到FlowControl
一般選擇當結果改變時,中斷自身(自身及下面的節點)
可以添加多個裝飾器判斷,只要一個滿足就會中斷
行為樹只有跟節點在亮,不進行其他操作
需要檢查所有的條件判斷是否有問題
在服務里面添加打印輸出,有時雖然Selector或Sequence上面的服務在執行,但是節點和線條并不會在閃爍,需要排查問題出現的節點位置和邏輯
添加wait節點分開其他節點來排查
其他邏輯
始終面朝玩家
通過一個task來實現面朝玩家的需求(tick需求)
但是task執行頻率是一次性,并且依賴行為樹的頻率,并不是完整的每幀執行
在task中重寫EventReceiveTickAI和EventReceiveExecuteAI
Execute是一開始執行,先獲取玩家(黑板值)和AI的轉向速度(自定義)
在Tick中不斷地比較目標旋轉和自身旋轉,使用RInterpTo來實現平滑數值過度,不能忘記finish