UE4官方行為樹快速入門文檔解析和修改


近學習了UE4官方文檔的行為樹快速入門指南,發現里面的部分邏輯稍稍有點混亂和重疊,於是加入了自己的想法,修改了部分行為樹邏輯,優化了其AI尋路能力。

 初始的基本操作和資源創建同官方文檔一樣:1個Follower_AI_CON即AI控制器,1個FollowerBT行為樹,1個FollowBlackboard黑板,1個Character藍圖資源AI_Character。

打開FollowBlackboard黑板資源,創建1個TargetToFollow的Object變量,1個HomeLocation的Vector變量,1個TargetLocation的Vector變量,保存后退出。

打開Follower_AI_CON控制器,創建1個HomeLocation的Name變量,編寫藍圖節點邏輯

 

添加EventBeginPlay事件,綁定黑板資源為FollowBlackboard,設置HomeLocation變量存儲AI_Character的初始坐標(Target為黑板自身,KeyName為Name變量HomeLocation,VectorValue為AI控制器下Pawn的ActorLocation),之后運行行為樹FollowerBT。

 

打開AI_Character藍圖,在Mesh中指定人物骨骼和角色動畫藍圖,選中Components窗口的AI_Character(self),在Pawn選項中指定AIControllerClass為Follower_AI_CON,這樣在創建AI_Character實例時,會自動創建1個AI控制器。

 

打開FollowerBT行為樹,點擊NewService,創建一個AgroCheck業務,前面的邏輯和官方文檔一樣,添加Branch節點判斷AI控制器的引用AI_CON_Ref是否為空,空則將EventReceiveTick的OwnerActor輸入參數強制轉換成目標AI控制器后賦值給AI_CON_Ref。之后獲取到場景中的所有AI_Character(在目標檢測中作為忽略Actor目標,防止AI_Character互相檢測導致混亂);獲取到AI控制器下Pawn的ActorLocation作為目標檢測的圓心(同時設置為MyLocation),Z軸添加15單位作為球體檢測的半徑終點,輻射半徑設為1000作為目標檢測的范圍,檢測的目標種類拖選成數組后設置為Pawn(即只會檢測到類型為Pawn的目標)。

 

 

個人覺得接下來官網教程的藍圖邏輯有些不合適。官網上將目標檢測的結果循環遍歷,創建一個射線檢測,MyLocation為起點,目標檢測到的Actor為終點(即二次檢測),別忘了Actor to Ignore連接到AI_Character。將射線檢測的結果Actor和目標檢測的結果Actor進行比較,結果作為Branch節點的判斷依據,相同則將該Actor設為TargetToFollow,並將其Location設為TargetLocation;不相同則將TargetToFollow設為空值。

個人覺得不合理的地方如下:

1.對目標進行的二次檢測重復多余,且沒有意義,相當於將一個數組中的元素與數組中的所有元素進行比較(包括自身比較自身,且邏輯上兩兩比較了兩遍),增加了邏輯復雜度和時間復雜度,導致的結果是之后的Branch節點頻繁被調用,雙分支(True,False)一直在重復執行;

2.並沒有突出檢測到的目標為正確尋路目標,而是使得所有在檢測范圍內的Pawn都符合尋路條件,AI_Character會將檢測到的第一個Pawn作為跟蹤對象;

3.目標監測范圍內沒有Pawn時,數組為空,導致之后的Branch節點不會執行。

所以我在官方文檔的基礎上加入了自己的想法,更改后的藍圖邏輯如下:

 

對目標檢測的輸出進行Branch判斷,檢測到Pawn目標時進行數組循環遍歷,沒有Pawn目標時直接對TargetToFollow賦值為空。對HitResult的Actor進行強制類型轉換,轉換成PlayerCharacter(玩家控制的角色),轉換成功則表示玩家進入AI_Character的檢測范圍,並將玩家設置為TargetToFollow,玩家的Location設置為TargetLocation。

打開FollowerBT行為樹,點擊NewDecorator創建一個CloseEnough的Decorator,

將輸入參數OwnerActor強制轉換為Follower_AI_CON,賦值給AI_CON_Ref,連接到輸出節點,添加1個Boolean輸出參數,將TargetToFollow的Location減去AI控制器下Pawn的Location(即AI_Character和目標之間的距離)和預設距離進行比較,大於等於預測距離(即兩者距離太遠)則為True(繼續執行Decorator下的邏輯),否則停止之后的邏輯。

打開FollowerBT行為樹,點擊NewTask,創建1個RapidMoveTo的任務,

 

首先進行AI_CON_Ref的非空判斷,為空則將OwnerActor強制轉換成Follower_AI_CON賦值給它,不為空則進行AIMoveTo,Pawn為AI控制器下的Pawn(即AI_Character),TargetActor為TargetToFollow。移動成功后結束此次行為樹任務。

最終的行為樹運行邏輯如下:

 

AgroCheck的刷新Tick為0.5s,TargetToFollow和TargetLocation分別對應於黑板資源的同名參數,之后進入分支判斷,TargetToFollow非空則進入左側,AI_Character和目標的距離大於100則進行RapidMoveTo任務;TargetToFollow為空則進入右側分支,判斷AI_Character是否位於TargetLocation,及TargetLocation是否為空,如果AI_Character已經到達TargetLocation則等待2.5s后返回HomeLocation。在這里我刪除了移動到TargetLocation的任務,否則會造成AI_Character在TargetLocation和HomeLocation之間不間斷的移動,刪除之后AI_Character移動回HomeLocation之后保持靜止,直到TargetToFollow的再次確立導致的左側行為樹分支開啟。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM