使用自定义数据进行标记

您可以使用称为 NavTag 的自定义数据标记 NavData 的任意区域,NavTag 可用来影响在运行时角色在区域中规划并跟随路径的方式。例如:

例如,下图显示了设置有几种不同类型的 NavTag 的地形:

NavTag 数据格式

每个 NavTag 包含:

NavTag 可以通过以下任一类来表示:

在生成时嵌入 NavTag

可通过多种方法将 NavTag 嵌入到为地形预先生成的静态 NavData 中。

标记单个三角形

每当 GeneratorInputProducer 类向 NavData 生成系统提供三角形时,都可以使用特定类型的 NavTag 来标记该三角形。

  • 调用 ClientInputConsumer::ConsumeTriangleFromPos()ClientInputConsumer::ConsumeTriangleFromPosInClientCoordinates() 方法,并将 NavTag 作为参数进行传递。

提供 TagVolume

GeneratorInputProducer 类可以指定体积,这些体积定义应自动应用到所有与体积相交的三角形的 NavTag。使用此方法:

  1. 创建 ClientInputTagVolume 类的实例。
  2. 在对 ClientInputTagVolume::Init() 的调用中使用体积的轮廓、高度和 NavTag 数据来设置实例。
  3. 在对 ClientInputConsumer::ConsumeTagVolume() 的调用中提供体积。

在运行时动态添加 NavTag

您可以通过生成 TagVolume 并将其指定给数据库,或通过使用由动态障碍物管理系统提供的动态 BoxObstacleCylinderObstacle 类,在运行时动态添加 NavTag。新 TagVolume 或障碍物区域中的 NavMesh 将自动重新生成并重新划分三角形以反映您的自定义 NavTag。

有关详细信息,请参见使用动态障碍物和 TagVolume

NavTag 颜色

您可以选择一种颜色来基于 NavTag 渲染三角形和 TagVolume。颜色有助于快速识别 NavTag。

可以使用以下函数设置 DynamicNavTag 颜色:

如果将 NavTag 设置为独占,其颜色将自动设置为红色,如下图所示。

注意:为生成 TagVolume 或运行时 TagVolume 指定 NavTag 的方法已更改,如以下图所示。在面板中的 NavTag 显示也已更改,以支持 NavTag 的颜色。

此外,运行时 TagVolume 的默认颜色为暗橙色,如下图所示。

NavTag 颜色的以下参数已添加到 GeneratorAdvancedParamaters 类:

这些颜色将在生成时间期间为 NavTag 自动设置。将为默认 NavTag 设置 m_emptyDefaultNavTagColor 参数或 m_nonEmptyDefaultNavTagColor 参数,具体取决于其是否为空。默认情况下,这适用于所有三角形。

在以下情形中,将为 NavTag 设置 m_nonDefaultNavTagColor 参数:

如果在添加三角形或 TagVolume 之前更改了 NavTag 的颜色,将不会设置 m_nonDefaultNavTagColor 参数。

可以在 Navigation Lab 的 Advanced Parameters 面板中修改这些颜色。请参见以下图:

以下方法已添加到 DynamicNavTag 类 :

标记 NavGraph

如果在地形中使用 NavGraph,您也可以使用 NavTag 标记其顶点和边。

  1. 创建将用于设置 NavGraph 的 NavGraphBlobBuilder 之后,在对 NavGraphBlobBuilder::AddNavTag() 的连续调用中传递要添加到 NavGraph 中任何顶点或边的每种类型的 NavTag 的实例。每种类型的 NavTag 均由方法返回的索引进行标识。
  2. 每次添加顶点或边时,使用 NavGraphBlobBuilder::AddVertexWithNavTag()NavGraphBlobBuilder::AddBidirectionalEdgeWithNavTag()NavGraphBlobBuilder::AddMonodirectionalEdgeWithNavTag() 方法,并传递与要用于标记该顶点或边的 NavTag 类型相对应的索引。

请参见创建 NavGraph

处理合并和冲突

当两个或更多通过不同 NavTag 进行标记的区域发生重叠时,不会合并 NavTag。而是通过调用 NavTag 类的 < 操作符保留确定为较低的 NavTag。

例如,在下图中,排他体积低于橙色体积,橙色体积低于绿色体积,而绿色体积低于浅蓝色体积。

有关详细信息,请参见 navtag.h 文件中的实现。