将地形划分为地块

对于许多项目,在游戏过程中的任意给定时间,只需加载相对较小的地形块。这些块(或地块)根据需要换入或换出内存,这通常是为了响应玩家角色的移动。使用地块以及如何组织地块的决定通常根据引擎中的物理或渲染等子系统的生产工作流、游戏玩法设计和技术注意事项来做出。

划分地块的方式

NavData 生成框架提供了一个高度灵活的系统来处理多个地块,旨在与典型的生产工作流平稳接合,并在运行时轻松掌控。

单地块地形

Gameware Navigation 不强制使用多个地块。可以选择一次性将整个地形传递到 NavData 生成系统,并生成覆盖整个地形的单个 NavMesh。但是:

  • 保存所有数据可能需要大量运行时内存。数据的内存大小随其代表的区域的增加而快速增长。
  • 随着数据集不断增大,寻径框架的性能可能会受到影响,因为该框架可能会在浏览大量顶点和边时关闭。在尝试计算通往无法到达的目标的路径时,影响尤为明显,因为此时必定会浏览 NavMesh 中的所有三角形。

为单地块地形生成的 NavData 无法在运行时自动缝合到其他任何 NavData,即使这两组 NavData 在 3D 空间中有重叠。

用户定义的地块

在许多项目中,相邻地块之间所需的边界根据游戏玩法而定。例如,在玩家角色穿过特定边界时,会对先前区域的碰撞世界和纹理取消流化处理,并流入新区域的碰撞世界和纹理。地块边界也可按在同一地形上并行工作的美工人员和关卡设计师之间的工作划分进行设置,其中每个边界在独立的网格或子级别(运行时在游戏过程中作为相关块以流式加载方式载入和清除出)上起作用。

在这种情况下,您可能希望 NavData 地块的边界与用于其他数据类型的地块或子关卡的边界大致相同。NavData 生成工具透明地支持以上情况,因为地块之间的划分通过向 Gameware Navigation 传递地形网格中的三角形的方式进行了显式定义。

在运行时将通过该方法创建的相邻地块加载到内存中时,其 NavData 将自动在重叠处缝合。

在 NavData 生成工具中创建地块

每个 NavData 生成工具处理地块划分的方式略有不同。到目前为止,NavData 生成框架 API 的处理方式最为灵活,但是您可以一如既往地选择任何适合生产管线需求的工具。

地块和 Navigation Lab

当前,Navigation Lab 会为每个 .obj 文件创建一个地块。

但是,如果加载 .navgenproj 文件(该文件包含配置有多个 .obj 文件的 <sector> 定义),Navigation Lab 将合并这些输入 .obj 文件中的所有三角形。

地块和 NavData 生成 API

如果直接使用 NavData 生成系统的 API,可以完全控制地形的地块划分。您可以为每个地块配置一个 GeneratorSectorConfig 对象,并将所有地块添加到提供给 GeneratorGeneratorInputOutput 结构。

  • 创建单地块地形:您可以通过仅为 Generator 定义一个地块并为该地块提供整个地形中完整三角形集来创建单地块地形。
  • 创建多个用户定义的地块:可以创建多个地块,其边界和内容由您显式设置。可以分别定义要为 Generator 创建的每个地块,并为每个地块仅提供应视为该地块组成部分的三角形。

Generator 在创建 NavData 时,会自动检测彼此相邻的地块,控制其重叠区域,并准备数据以便在运行时进行自动缝合。为使相邻地块在运行时缝合在一起,沿相邻地块交界的三角形彼此之间应非常接近或重叠。请参见处理地块重叠