使用自定义数据进行标记
您可以使用称为 NavTag 的自定义数据标记 NavData 的任意区域,NavTag 可用来影响在运行时角色在区域中规划并跟随路径的方式。例如:
- 您可以使用 NavTag 来标识不同类型的地形或材质,例如人行道、草地、岩浆等。您可以控制每个角色能够穿越的 NavTag 类型。有关详细信息,请参见禁止选择、避免选择和优先选择 NavTag。
- 您可以使用 NavTag 来标识要用于影响或控制角色的寻径的智能对象类型,如电梯、跳跃点或传送机。有关详细信息,请参见监视 PathEvent和创建智能对象。
- 您可以使用查询或直接从区域中的 NavMesh 三角形或 NavGraph 检索 NavTag。您可以根据需要使用此信息;例如,您可以在决策逻辑中使用此信息来影响高级行为。
例如,下图显示了设置有几种不同类型的 NavTag 的地形:
NavTag 数据格式
每个 NavTag 包含:
- 您提供的整数数组。这些值的重要性完全由您来定义。
- 确定是否应将 NavTag 视为“排他”的标志:即所有角色均不能行走。例如,上图中的 V 标记为“排他”,将在 NavMesh 中有效地冲压一个孔。
NavTag 可以通过以下任一类来表示:
- 静态 NavTag 类。通常,当读取与特定路径事件或 NavData 元素关联的 NavTag 时会向您返回该类。
- 可变 DynamicNavTag 类。通常使用此类来构建提供给 Gameware Navigation 的 NavTag。
在生成时嵌入 NavTag
可通过多种方法将 NavTag 嵌入到为地形预先生成的静态 NavData 中。
标记单个三角形
每当 GeneratorInputProducer 类向 NavData 生成系统提供三角形时,都可以使用特定类型的 NavTag 来标记该三角形。
- 调用 ClientInputConsumer::ConsumeTriangleFromPos() 或 ClientInputConsumer::ConsumeTriangleFromPosInClientCoordinates() 方法,并将 NavTag 作为参数进行传递。
NavTag 颜色
您可以选择一种颜色来基于 NavTag 渲染三角形和 TagVolume。颜色有助于快速识别 NavTag。
可以使用以下函数设置 DynamicNavTag 颜色:
如果将 NavTag 设置为独占,其颜色将自动设置为红色,如下图所示。
注意:为生成 TagVolume 或运行时 TagVolume 指定 NavTag 的方法已更改,如以下图所示。在面板中的 NavTag 显示也已更改,以支持 NavTag
的颜色。
此外,运行时 TagVolume 的默认颜色为暗橙色,如下图所示。
NavTag 颜色的以下参数已添加到 GeneratorAdvancedParamaters 类:
这些颜色将在生成时间期间为 NavTag 自动设置。将为默认 NavTag 设置 m_emptyDefaultNavTagColor 参数或 m_nonEmptyDefaultNavTagColor 参数,具体取决于其是否为空。默认情况下,这适用于所有三角形。
在以下情形中,将为 NavTag 设置 m_nonDefaultNavTagColor 参数:
- 将三角形与 NavTag(其颜色未由用户更改)一起提供。
- 将生成 TagVolume 与 NavTag(其颜色未由用户更改)一起提供。
如果在添加三角形或 TagVolume 之前更改了 NavTag 的颜色,将不会设置 m_nonDefaultNavTagColor 参数。
可以在 Navigation Lab 的 Advanced Parameters 面板中修改这些颜色。请参见以下图:
以下方法已添加到 DynamicNavTag 类 :
- DynamicNavTag::IsExclusive() – 如果 NavTag 为独占,则返回 true。
- DynamicNavTag::IsOnNavMesh() – 如果 NavTag 的当前实例与 NavMesh 三角形关联,则返回 true。
- DynamicNavTag::IsOnNavGraph() – 如果 NavTag 的当前实例与 NavGraph 边或顶点关联,则返回 true。
- DynamicNavTag::IsFromGeneration() – 如果在生成期间 NavTag 的当前实例与 NavMesh 三角形关联,则返回 true。如果在运行时 NavTag 的当前实例来自动态 NavMesh 标记,则返回
false。
- DynamicNavTag::IsFromRuntime() – 如果在生成期间 NavTag 的当前实例与 NavMesh 三角形关联,则返回 false。如果在运行时 NavTag 的当前实例来自动态 NavMesh 标记,则返回
true。
- DynamicNavTag::IsGenerationDefault() – 如果在生成期间 NavTag 的当前实例是用于标记三角形的默认 NavTag,则返回 true。
- DynamicNavTag::GetVisualColor() – 返回 NavTag 的 VisualColor。
处理合并和冲突
当两个或更多通过不同 NavTag 进行标记的区域发生重叠时,不会合并 NavTag。而是通过调用 NavTag 类的 < 操作符保留确定为较低的 NavTag。
例如,在下图中,排他体积低于橙色体积,橙色体积低于绿色体积,而绿色体积低于浅蓝色体积。
有关详细信息,请参见 navtag.h 文件中的实现。