在 3DGS 场景中生成导航网格
Navigation System Support
适用范围
本篇针对使用 LCC 碰撞数据构建导航的场景,因此只适用于 ALCCActor 与 ALCC2Actor——只有 .lcc 与 .lcc2 格式自带碰撞数据,详见碰撞。
.sog、.spz、.ply 不含碰撞数据,需要自行用 Blocking Volume 或近似网格搭建可行走区域。这类几何体是标准的 UE 对象,导航配置按 Unreal Engine 官方流程处理即可,不涉及本篇的特殊事项。
概述
Unreal Engine 的 Navigation System 通过 NavMesh 为 AI 角色提供可行走区域。NavMesh 的生成依赖场景中可影响导航且具有有效碰撞的几何体。
LCC 碰撞是分块动态加载的:只加载相机周围一定范围内的碰撞块,并随相机移动换入换出(机制详见碰撞:加载机制)。这一点直接决定了导航的配置策略:
- 碰撞块在运行期换入换出会触发 NavMesh 重建,造成卡顿
- 因此应让目标区域的碰撞一次性全部加载完成,再用
Static模式构建导航
对于 LCC 场景,Runtime Generation 推荐使用 Static。Dynamic 会持续响应碰撞变化并重建 NavMesh,配合分块加载的碰撞会频繁触发重建,在大场景中造成明显的 CPU 开销与卡顿。
前提条件
| 条件 | 说明 |
|---|---|
| 数据包含碰撞文件 | .lcc 需要 collision.lci(旧版本为 collision.bin);.lcc2 需要 data/mesh/ 下的 .ply 文件。详见碰撞:前置条件 |
| 碰撞已启用 | Actor 的 bEnableCollision = true |
| 碰撞数据已加载 | 在视图模式中选择玩家碰撞或可视性碰撞,可以看到已加载的碰撞体 |
| Actor 可影响导航 | Actor 的 CanEverAffectNavigation = true |
| 碰撞加载范围足够 | Max Load Collision Distance(m) 覆盖需要构建导航的目标区域,默认 300 米 |
| NavMesh 构建边界足够 | 场景中已放置 NavMeshBoundsVolume,并覆盖需要 AI 活动的目标区域 |
碰撞加载距离和
NavMeshBoundsVolume控制不同范围:前者决定哪些区域有碰撞数据,后者决定引擎在哪些边界内构建 NavMesh。要让目标区域生成可用 NavMesh,二者都必须覆盖该区域。
使用步骤
1. 启用并检查 LCC 碰撞
选中 ALCCActor 或 ALCC2Actor,在 Details 面板中启用 Enable Collision(bEnableCollision),或通过代码启用:
LCCComponent->SetLCCCollisionEnable(true);
同时确认 Actor 的 CanEverAffectNavigation = true,使其碰撞能够参与导航构建。
加载 LCC 数据后,在视图模式中选择玩家碰撞或可视性碰撞,检查目标区域内是否已经出现碰撞体。碰撞使用异步物理烘焙,3DGS 画面开始渲染后仍可能需要等待几秒才能就绪。

使用玩家碰撞或可视性碰撞模式,确认目标导航区域内的 LCC 碰撞体已加载
2. 配置碰撞加载范围
LCC 碰撞仅在 Max Load Collision Distance(m) 指定的范围内加载,默认 300 米。
配合导航时应把这个值调大到覆盖整个 AI 活动区域,让碰撞一次性全部加载完成。否则运行期碰撞块随相机移动不断换入换出,会持续触发 NavMesh 重建,造成明显卡顿。范围足够大时,运行期不再有碰撞变化,导航也就不会重建。
代价是启动时加载时间变长、内存占用增加。可通过 stat xgrids 的 Collision Data Usage 确认全量加载后的内存是否可接受,详见碰撞:一次性加载全部碰撞。
不要把 Runtime Generation 改为 Dynamic 来解决碰撞距离不足。 Dynamic 不会扩大碰撞加载范围,超出该距离的区域仍然没有碰撞可用于导航构建。
3. 放置并调整 NavMeshBoundsVolume
在场景中放置 NavMeshBoundsVolume,移动并缩放它,使其覆盖希望 AI 活动的完整区域。

放置并缩放 NavMeshBoundsVolume,使导航构建边界覆盖完整的 AI 活动区域
再次确认两个范围同时满足要求:
- Max Load Collision Distance(m):决定目标区域内是否存在已加载的 LCC 碰撞;
- NavMeshBoundsVolume:决定 Unreal Engine 在哪些边界内构建 NavMesh。
仅增大其中一个范围不足以解决另一个范围未覆盖的问题。
4. 配置 Navigation System
| 设置 | 推荐值 | 说明 |
|---|---|---|
| Runtime Generation | Static | 首选设置。导航只在编辑器构建时生成,避免运行时持续重建造成性能开销 |
| Cell Size | 默认值 | 值越小,NavMesh 越精确,但构建时间、内存和运行开销越大 |
何时才使用 Dynamic
只有确实需要 NavMesh 在运行期随几何体变化自动重建时才考虑 Dynamic,例如运行时会改变可行走区域的交互场景。
配合 LCC 碰撞使用 Dynamic 尤其要谨慎:碰撞本身就是分块动态加载的,每次碰撞块换入换出都会被判定为几何体变化并触发导航重建,在大场景中可能持续产生 CPU 开销与卡顿。确实需要 Dynamic 时,应同时把碰撞加载范围调大到覆盖整个活动区域,避免运行期出现碰撞变化。
不要仅为了增加碰撞距离或导航覆盖范围而启用 Dynamic。
5. 等待碰撞就绪并构建 Static NavMesh
使用推荐的 Static 模式时,按以下顺序操作:
- 加载 LCC 数据,确认 3DGS 画面已经显示;
- 等待异步碰撞烘焙完成;
- 使用玩家碰撞或可视性碰撞模式,确认目标区域内的碰撞已经加载;
- 确认 Collision Load Max Distance 和
NavMeshBoundsVolume都覆盖目标区域; - 在 Unreal Engine 主菜单中执行 Build → Build Paths;
- 等待导航构建完成;
- 保存关卡和导航数据。
验证与排查
按 P 键在视口中显示 NavMesh:
- 绿色区域:已生成可行走 NavMesh;
- 无绿色区域:该位置未生成 NavMesh,需要按下方顺序排查。

按 P 键验证 NavMesh;绿色覆盖表示对应区域已经生成可行走导航数据
如果目标位置没有绿色 NavMesh,请依次检查:
- 数据是否包含碰撞:确认使用的是
.lcc或.lcc2,且数据目录下有对应的碰撞文件;单文件格式不含碰撞,无法用本篇流程; - 碰撞是否启用并已加载:确认
bEnableCollision = true、CanEverAffectNavigation = true,并在玩家碰撞或可视性碰撞模式下看到目标位置的碰撞体; - 碰撞加载范围是否足够:如果目标位置超出加载范围,增大
Max Load Collision Distance(m)并等待碰撞重新就绪; - NavMeshBoundsVolume 是否覆盖目标位置:移动或缩放 Volume,使导航构建边界完整覆盖目标区域;
- Static NavMesh 是否重新构建:碰撞和范围确认无误后,执行 Build → Build Paths,等待完成并保存关卡和导航数据;
- 再次按 P 检查绿色覆盖。
以上均正确但仍无法生成时,可进一步检查 Output Log 中的 Navigation、Recast 和碰撞相关错误,并确认当前关卡已经保存。