使用动态障碍物和 TagVolume

Gameware Navigation 提供了两种不同的方法来处理 World 中存在的动态和可销毁障碍物。应使用哪种方法主要取决于障碍物是否是移动的。

障碍类

有三种可能的类可用于表示障碍物:

TagVolume

TagVolume 类表示其范围始终集成到 NavMesh 的静态物理障碍物或抽象区域。

每个 TagVolume 均会标记 NavMesh 的区域,该区域覆盖有对象初始化中设置的 NavTag。此 NavTag 可标记为“排他”,这会将该区域标记为不可导航(本质上是在 NavMesh 中打孔)。此外,还可以标记具有数据整数值的自定义数组的区域,您可以在寻径、路径跟随和查询期间检索和处理该区域。有关 NavTag 系统的详细信息,请参见使用自定义数据进行标记

例如,右侧的 TagVolume 已标记为“排他”。左侧的 TagVolume 已标记具有自定义数据的 NavMesh,默认情况下,该区域仍可行走,但您可以在路径跟随期间检测并响应 NavTag。

直接使用此类来表示:

  • 不阻碍物理体积的障碍物或区域,如布雷区、洪水区、具有不同地形类型的区域等。
  • 相对静止且其范围和位置不会改变的物理障碍物,如树、灯柱、大型家具或木箱等。

请参见设置 TagVolume

CylinderObstacle

CylinderObstacle 类表示其尺寸最好表示为一个圆柱体的可移动物理对象。

默认情况下,只有动态回避系统才会考虑这些对象。但是,当这些对象处于静止状态时,您可以轻松地请求它们将自己集成到 NavMesh 中,这可以通过透明地生成内部 TagVolume 来实现。

例如,左侧的橙色圆柱体在移动,并且只有动态回避系统才会考虑它们。其他圆柱体处于静止状态并集成到 NavMesh 中:灰色区域上的圆柱体具有设置为“排他”的 NavTag,绿色区域上的圆柱体具有包含自定义数据值的 NavTag。

使用此类来表示:

  • 玩家控制的角色。
  • 圆柱形对象(如筒或柱子,前提是其轴一直接近垂直)。

请参见设置 CylinderObstacle

BoxObstacle

BoxObstacle 类表示任何具有固定范围和长方体形体积的可移动或可自由旋转的物理对象。

默认情况下,只有动态回避系统才会考虑这些对象。但是,当这些对象处于静止状态时,您可以轻松地请求它们将自己集成到 NavMesh 中,这可以通过透明地生成内部 TagVolume 来实现。

例如,左侧的橙色长方体在自由移动和旋转,因此只有动态回避系统才会考虑它们。其他长方体处于静止状态并集成到 NavMesh 中:灰色区域上的长方体具有设置为“排他”的 NavTag,棕色区域上的长方体具有包含自定义数据值的 NavTag。

使用此类来表示:

  • 移动的车辆。
  • 可移动的木箱或家具、门、爆炸之后的碎石等。

请参见设置 BoxObstacle

动态 NavMesh 性能

将 TagVolume 集成到 NavMesh 的计算量可能相当大。该过程会自动分割时间以避免 CPU 峰值,但不能保证新的 TagVolume 将立即集成到 NavMesh,甚至无法在给定的帧数内集成到 NavMesh。

为了获得最佳性能,请执行以下操作: