目录
RVO Avoidance与Detour Crowd AI Controller的区别
如何使用Detour Crowd AI Controller
问题阐述与解决效果
在项目存在大规模寻路人群时,很容易出现两个角色的寻路路径相冲突,就会造成这种互斥现象。
UE4为此提供了一种能够动态规划 调整AI角色的寻路路径组件——UCrowdFollowingComponent(仅在C++中可定义),并将它命名为DetourCrowdAIController方法,最下方对正确的使用方法进行了描述。
RVO Avoidance与Detour 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即可,注意修改类名为自己的类名。