【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即可,注意修改类名为自己的类名。

 

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