日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[unreal] 寻路:随机漫游的实现

發布時間:2024/1/1 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [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] 寻路:随机漫游的实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。