在Unreal中,当我们构建导航后,引擎会默认生成一个“导航数据“,相关寻路模块(如PathFollowingComponent)会根据生成的导航数据进行相关逻辑的计算。

但是,有时仅有一个导航数据并不能完全满足我们的项目需求,比如我们希望有些角色可以通过到达某些区域而其他角色不可到达,这时我们可能针对不同的角色划分不同的导航数据,然后指定角色应用对应的导航数据。庆幸的是,Unreal提供了多导航数据的解决方案,但是相关资料比较缺乏,因此我想把我探索和思考的一些内容进行分享,希望对大家有所帮助。

1、导航数据的配置

打开【Edit】->【Project Settings】->【Navigation System】,其中的配置项【Supported Agents】存放了导航Agent相关配置的信息,可以看到UE默认的导航数据也配置于此。

SupportAgents是一个数组,因此我们可以扩展自定义的Agent。

2、创建导航类型

我们需要继承ARecastNavMesh,以创建我们自己的导航类型。

同时在SupportAgents中选择新创建的NavData类型。

此时,多导航数据Agent已经配置好。

3、生成导航

创建一个NavMeshBoundVolume,现在可以看到SupportAgents配置项中存在两个导航Agent(如果未出现变化,可以重启引擎),勾选需要生成的导航类型,即可生成对应的导航数据。

这里需要注意的点:

  1. 如果调整Volume大小但导航Mesh并未变化,需要检查【Edit】->【Editor Preferences】->【Update Navigation Automatically】是否打开,未打开的话需要手动构建导航(【Build】->【Build Paths】)。
  2. 所有自定义的导航Mesh都是默认不显示的,如需显示,需要在Outliner下找到自定义的导航Mesh,并将EnableDrawing勾选。

4、指定导航数据

CharacterMovementComponent里的MovementCapabilities配置里可以指定该角色移动时应该应用哪些导航数据,在这里我们可以指定希望根据哪个导航数据来完成移动


一般来讲我们可以通过默认导航结合NavModifierVolume处理大部分AI导航需求,多导航的应用场景相对较少,本文并未深入研究里面的机制,仅是在应用层面做了简单的说明,属实比较遗憾,希望过后有机会可以深入源码好好探讨一下UE导航生成的门道。