本文介绍了如何在虚幻引擎的 世界分区(World Partition) 系统中使用世界分区的 导航网格(Navigation Mesh)。
世界分区是一种自动数据管理和基于距离进行加载的关卡流送系统,它针对大型世界管理提供了一个完整的解决方案。这个系统将整个世界划分为网格单元,保存在一个固定的关卡,使制作者不再需要划分繁冗的子关卡,并提供一个自动流送系统,基于与流送源之间的距离来加载和卸载这些网格。
要更多地了解该系统,请阅读世界分区文档。
该文档仅针对世界分区的静态导航网格。
1 - 需要的设置
-
从 游戏 分类中的模板中创建一个新的项目。在该示例中,我们选用 第三人称(Third Person) 模板。
-
在编辑器中,点击 文件(File) > 新建关卡(New Level)。选择 开放世界(Open World) 地图类型并点击 创建(Create)。保存关卡。
开放世界默认地图类型设计为创建大型开放世界地图的起始点,默认启用了以下功能:
- 世界分区
- 一文件一Actor
- 数据分层
- 细节层级结构
-
找到 世界设置(World Settings) 窗口并向下滚动到 世界分区(World Partition) 部分。
-
展开 运行时设置(Runtime Settings) > 网格(Grids) > 序号(Index) [0]。
-
将 加载范围(Loading Range) 数值修改为 12800。更小的数值可以让世界分区加载导航网格时更容易可视化。
-
阶段成果
在这一小节,你创建了一个新的项目,并将一个关卡设为使用世界分区。下一小节,你将会配置一个导航网格来在世界分区中使用。
2 - 配置导航网格来使用世界分区
-
点击 设置(Settings) > 项目设置(Project Settings) 来打开 项目设置(Project Settings) 窗口。
-
点击 导航网格(Navigation Mesh) 分类并向下滚动到 运行时(Runtime) 部分。点击 运行时生成(Runtime Generation) 下拉菜单并选择 静态(Static)。
-
对于更大的地图,你可以 启用 固定图块池大小(Fixed Tile Pool Size) 复选框,并设置一个 图块池大小 来限制图块池占用的内存量。在设置池大小时,要确保包含足够图块,以便所有被加载的世界分区单元也能加载其相应的NavMesh图块。
-
点击 添加(Add) + > 体积(Volumes) > NavMeshBoundsVolume 来向你的关卡中添加一个 导航网格(Navigation Mesh) 体积Actor。
-
在 大纲(Outliner) 窗口中选择 NavMeshBoundsVolume Actor然后前往 细节(Details) 面板。
-
缩放(Scale) Actor来使其覆盖关卡的整个可游玩空间。
-
按下 P 键来看到导航在视口中构建。
-
-
在 大纲(Outliner) 窗口中选择 RecastNavMesh-Default Actor然后前往 细节(Details) 面板。向下滚动到 生成(Generation) 部分然后 启用(enable) Is World Partitioned 复选框。
阶段成果
在这一小节中,你向关卡中添加了导航网格边界。你还配置了导航网格来将其与世界分区一起使用。
下一小节,你将会配置编辑器来优化工作流程。
3 - 配置编辑器
由于你使用的关卡很可能非常大,我们建议停用自动导航网格生成来优化工作流程。
请执行以下步骤:
-
点击 编辑(Edit) > 编辑器偏好(Editor Preferences) 来打开 偏好(Preferences) 窗口。
-
向下滚动到 关卡编辑器(Level Editor) 部分然后点击 杂项(Miscellaneous) 分类。向下滚动到 编辑(Editing) 分类,停用 自动更新导航(Update Navigation Automatically) 复选框。
阶段成果
在这一小节,你配置了你的导航网格来不让它自动更新。这样会在你在大型世界中使用世界分区时优化你的工作流程。
下一小节,你将会在关卡中构建导航网格。
4 - 构建导航网格
对于使用了世界分区的地图,一些资产会在其它资产卸载时进行加载。因此,构建整个导航网格的流程有所不同。
要在你的关卡中构建导航网格,执行以下步骤:
-
在指令行中输入以下控制台指令并按下 回车:n.bNavmeshAllowPartitionedBuildingFromEditor 1

-
点击 构建(Build) > 构建路径(Build Paths) 来在你的关卡中构建导航网格。
-
在 构建导航设置(Build Navigation Settings) 窗口中,点击 Ok 来构建导航网格。你还可以选用以下选项:
-
详尽(Verbose) - 选用该复选框来查看构建进程更详细的日志。你可以在项目目录的 Saved > Logs 下找到输出日志 WPNavigationBuilderLog.txt
-
清除包体(Clean Packages) - 启用该项来将所有世界分区的NavMesh Actor包体从项目中移除。这将不会构建导航。
-
-
前往 大纲(Outliner) 窗口,你会注意到现在其中有了四个 NavDataChunk Actors。这些Actor包含由世界分区加载和卸载的导航数据。创建的NavDataChunk Actor的数量取决于数据块网格的大小(更多细节请参考第六小节)。
阶段成果
在这一小节,你学会了如何在关卡中构建导航。你还了解了不同的导航设置选项,以及NavDataChunk Actor如何在关卡中创建。
下一小节,你将学习如何在编辑器外构建导航。
5 - 用世界分区导航数据构建器构建导航网格
你也可以通过使用 WorldPartitionBuilderCommandlet 和 WorldPartitionNavigationDataBuilder 来在编辑器外构建一个世界分区的静态导航网格。
在世界分区文档的 世界分区导航数据构建器(World Partition Navigation Data Builder) 小节中学习如何进行该操作。
6 - 导航网格的额外设置
-
前往 世界设置(World Settings) 窗口并向下滚动到 导航部分(Navigation) 来找到关卡的 导航网格(Navigation Mesh) 设置。
选项如下所示:
设置 描述 导航数据块网格大小(Navigation Data Chunk Grid Size) 该项定义世界分区每个单元格加载的数据块Actor的大小。数值越小,数据就越颗粒化。 导航数据构建器加载单元格大小(Navigation Data Builder Loading Cell Size) 该项定义用于将导航数据加载进内存的加载单元格的大小。 将 导航数据块网格大小(Navigation Data Chunk Grid Size) 设为 25600。这个较低的数值可以更好地显示世界分区如何加载和卸载导航网格。该数值应该根据你的游戏需要、加载范围以及需要的颗粒度进行调整。
-
点击 构建(Build) > 构建路径(Build Paths) 来在你的关卡中构建导航网格。
-
前往 大纲(Outliner) 窗口,你会注意到现在关卡中有了很多个 NavDataChunk Actor。这是正常现象,因为数据块网格比之前更小了。
阶段成果
在该小节中,你学会了如何更改导航数据块网格大小以及其如何影响关卡中NavDataChunk Actor的数量。
下一小节,你将会看到玩家在关卡中运动时导航网格如何加载和卸载。
7 - 查看你的结果
执行以下步骤来查看导航网格如何通过世界分区单元格加载和卸载。
-
在指令行中输入以下导航网格游戏调试控制台指令,然后按下 回车:
1. **ai.debug.nav.RefreshInterval 0.3** 2. **ai.debug.nav.DisplaySize 100** 这些指令会调整显示大小以及导航网格显示的更新频率。 
-
按下 游玩(Play) 来开始游戏。按下 波浪线键 (~) 打开控制台,然后输入以下世界分区调试指令:
1. **wp.Runtime.ToggleDrawRuntimeHash2D** 2. **wp.Runtime.ShowRuntimeSpatialHashGridLevel 2** 这些指令会显示玩家周围加载了哪些世界分区单元格。 
-
按下 单引号键 (') 来启动 游戏调试器(Gameplay Debugger),然后按下 0 来切换到 导航(Navigation) 视图。现在你可以看到玩家周围加载导航网格。
-
在关卡中移动并且看到导航网格随着世界分区单元格在玩家周围加载。
阶段成果
在这一小节中,你学会了如何将世界分区对导航网格的加载和卸载可视化。