【UE4 C++】大規模人羣繞行避讓的最優解DetourCrowdAIController如何開啓

目錄

問題闡述與解決效果

RVO Avoidance與Detour Crowd AI Controller的區別

如何使用Detour Crowd AI Controller

藍圖

 C++

棄用的寫法

新版寫法(也很簡便)


問題闡述與解決效果

在項目存在大規模尋路人羣時,很容易出現兩個角色的尋路路徑相衝突,就會造成這種互斥現象。

使用AI Controller

UE4爲此提供了一種能夠動態規劃 調整AI角色的尋路路徑組件——UCrowdFollowingComponent(僅在C++中可定義),並將它命名爲DetourCrowdAIController方法,最下方對正確的使用方法進行了描述。

使用Detour Crowd AI Controller

RVO AvoidanceDetour Crowd AI Controller的區別

實際上UE4還有一種較簡單的方法——只需勾選Character Movement組件下的RVO Avoidance(Reciprocal Velocity Obstacle Algorithm),也有避讓的效果,但自然也有它的弊端。AI角色必須擁有Character Movement組件,更重要的是它不關心NavMesh尋路網格的邊界,意味着在該方法下,角色存在走出尋路網格失控的風險。

因而Detour Crowd AI Controller用更復雜的算法,解決了該問題。

在使用中時切忌同時開啓,因爲這樣藍圖中的RVO設置會覆蓋掉DetourCrowd,使它無效。

如何開啓Detour Crowd AI Controller

在項目設置——羣集管理器中設置Crowd支持的最大代理數,也就是能控制的AI角色個數。

藍圖

當使用藍圖創建DetourCrowdAIControllerr時,只需新建-繼承自該Class即可。

 C++

錯誤的寫法

傳統的寫法,我們只需創建一個普通的AIController類,將類繼承自ADetourCrowdAIController,引用對應的頭文件就能實現。但這種寫法是錯誤的,

#include "Runtime/AIModule/Classes/DetourCrowdAIController.h"
class NIER_API ANpcAIController : public ADetourCrowdAIController
{
	GENERATED_BODY()
};

//繼承會報錯
error LNK2019	無法解析的外部符號 "public: __cdecl ADetourCrowdAIController::ADetourCrowdAIController(class FObjectInitializer const &)" (??
0ADetourCrowdAIController@@QEAA@AEBVFObjectInitializer@@@Z),該符號在函數 "public: __cdecl ANpcAIController::ANpcAIController(class FObjectInitializer const &)" (??
0ANpcAIController@@QEAA@AEBVFObjectInitializer@@@Z) 中被引用	

正確的寫法(也很簡便)

打開引擎源碼文件DetourCrowdAIController.h,類似的將該組件加入自己的AIController即可,注意修改類名爲自己的類名。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章