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