[unreal] 寻路:随机漫游的实现
reference: https://forums.unrealengine.com/community/general-discussion/1377-ue4-pathfinding-basic-ai?1270-UE4-Pathfinding-basic-AI=
by : UE developer,IceWraith
? ? ? ? 隨機漫游的效果可以有很多種實現方法,這取決于你想要使用哪種系統。
? ? ? ? 最好的(也是最復雜的)方法是準備行為樹,不過你需要在編輯器首選項(菜單:編輯->編輯器偏好設置->試驗性功能)中開啟它們。你可以依照上面提到的教程,或者也可以按照以下步驟執行:
? ? ? ? (1) 創建新的黑板資源(右鍵人工智能->黑板),用來存儲目標點:只包含的單一的鍵,鍵的類型設置為BlackbordKeyType_Vector。
? ? ? ? (2) 創建新的行為樹任務,用以挑選隨機的位置,這既可以在藍圖中完成,也可以在C++中完成。
? ? ? ? 藍圖:新建一個藍圖(父類為BTTask_BlueprintBase), 重點在于:添加一個BlackboardKeySelector類型的變量,并且設置它的屬性為public(點擊變量旁邊的眼睛,設置=public)
? ? ? ? C++:新建一個繼承自UBTTask_BlackboardBase的類,實現你自己的ExecuteTask()函數。
? ? ? ? 代碼:
EBTNodeResult::Type UBTTask_FindLocation::ExecuteTask(class UBehaviorTreeComponent* OwnerComp, uint8* NodeMemory) {UNavigationSystem* NavSys = UNavigationSystem::GetCurrent(OwnerComp);AAIController* MyAI = Cast<AAIController>(OwnerComp->GetOwner());if (NavSys && MyAI && MyAI->GetPawn()){const float SearchRadius = 1000.0f;FNavLocation RandomPt;const bool bFound = NavSys->GetRandomPointInRadius(MyAI->GetPawn()->GetActorLocation(), SearchRadius, RandomPt);if (bFound){OwnerComp->GetBlackboardComponent()->SetValueAsVector(GetSelectedBlackboardKey(), RandomPt.Location);return EBTNodeResult::Succeeded;} }return EBTNodeResult::Failed; }? ? ? ? (3) 創建新的行為樹,在root屬性中設置你的黑板。你可以從包含兩個節點的序列組合開始:FindSpot(在步驟2中做的)和MoveTo,它們共同訪問黑板中的同一個鍵。
? ? ? ? (4) 新建一個AI,并在里面運行剛才的行為樹。最簡單的方法是在關卡藍圖中調用SpawnAI
? ? ? ? 正如我所說的,這是最復雜的方法,但是為你之后的修改提供了一個最好的出發點。
? ? ? ? 下面是藍圖中比較簡單的設置:
? ? ? ? 1. 調用AIController中的MoveToLocation和MoveToActor方法。
? ? ? ? 2. 綁定AIController中的ReceiveMoveCompleted事件,來檢測是否達到了目的地。
? ? ? ? 3. 調用GetRandomPoint / GetRandomPointInRadius函數(NavData和FilterClass都設為空),在navmesh中選擇隨機目標點。
? ? ? ? 對于藍圖還有更為簡單的設置:
? ? ? ? 1. 調用AI MoveTo函數,它會為你執行結束時的事件。
? ? ? ? 2. 調用GetRandomPoint / GetRandomPointInRadius函數(NavData和FilterClass都設為空),在navmesh中選擇隨機目標點。
? ? ? ?最后,是C++的版本:
? ? ? ? 1.調用AIController中的MoveToLocation / MoveToActor函數。
? ? ? ? 2. 重寫AIController的OnMoveCompleted來檢測下一個目標點。
? ? ? ? 3. 訪問導航系統中隨機一個位置的方法如上所示。
? ? ? ? 這時候,讓我們討論一下怎樣修改尋路的影響因子。你可以定義包含不同行程或者耗費的導航區域,使用C++或者是藍圖。新建繼承自NavArea的藍圖/c++類。我強烈建議將遍歷耗費(初始耗費屬性)設置為大于等于1。區域通常由NavModifierVolume或者靜態網格構造的動態障礙物來完成的(為了了解更多的細節,可以查看靜態網格的NavCollision屬性)
? ? ? ? 此外,你可能還需要檢查額外的兩個actor: ANavLinkProxy(例如跳轉鏈接)和ANavigationTestingActor (尋路調試工具,包括單步顯示)
? ? ? ? 希望能夠給你帶來幫助!
總結
以上是生活随笔為你收集整理的[unreal] 寻路:随机漫游的实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎样在xp下用上雅黑字体
- 下一篇: ubuntu 16.04 安装 uvcv