Gameware Navigation 的大多数组件和子系统均依赖于 NavData,NavData 是世界内的一组数据结构,提供了游戏地形几何体的抽象表示,并进行了建模以支持高性能空间查询和寻径。
NavData 是游戏中 AI 的重要资源。它将通知您的角色可以移动和不能移动的位置,并最终为角色做出决策和移动的依据。因此,要充分利用 Gameware Navigation,使用精确映射游戏世界的 NavData 至关重要。
本章提供了有关 NavData 以及如何为游戏世界有效生成满足项目需求的 NavData 的详细信息。
角色使用 NavData 来确定游戏世界的哪些区域可以导航。因此,NavData 必须反映要使用它的角色的物理属性和移动功能。具有不同尺寸或以不同方式移动的角色可能需要完全不同的 NavData。例如,人类在某个世界中可以到达的位置的表示并非汽车或恐龙在同一世界中可以到达的位置的有效表示。
如果您具有不同比例的不同类型的角色,则可能需要具有不同的 NavData 集来表示它们的移动可能性。如果它们的比例足够接近,且运行时不会在游戏中产生奇怪的轨迹,则您可以通过使两种类型的角色共享一组 NavData 来节省内存。但是,如果这样做,应始终为较大的角色生成 NavData。
请参见使用多个数据库。
以下部分介绍了 Gameware Navigation 中使用的 NavData 的主要类型:NavMesh 和 NavGraph。
NavMesh 是在地面上行走的角色可以访问的静态 3D 世界中的区域表示。NavMesh 由一组相连的三角形组成,这些三角形定义角色可以自由移动的区域(称为“NavMesh 内部”)。不包括在 NavMesh 三角形内的任何区域均称为“NavMesh 外部”。在正常情况下,Gameware Navigation 在角色跟随路径时不会使角色超出 NavMesh(除非通过使用 NavGraph;参见下文)。
下图显示了 NavMesh 的视觉表示。请注意,NavMesh 的彩色三角形将形成一个曲面,该曲面填充地形中可以行走的区域。还请注意,NavMesh 的边界距离墙和静态障碍物很近。此距离大约等于使用 NavMesh 的角色的一半宽度。防止角色中心(假定其位置即此中心)与静态障碍物的距离小于此距离可以避免与静态障碍物发生碰撞。
虽然 NavMesh 本质上是一个二维曲面,但它完全支持具有多个楼层和螺旋楼梯且三维复杂性较高的区域。
Gameware Navigation 寻径和路径跟随系统主要使用 NavMesh 确定静态和动态对象在地形中的位置,并确定两个点之间的直达路径上存在哪些障碍物。当角色尝试清除路障或寻找通往路前方某个位置的捷径时,这尤其有用。如果没有 NavMesh,角色将无法知道自己与世界中另一个位置之间是否存在障碍物,除非通过对物理世界执行昂贵的光线投射和碰撞测试。使用 NavMesh 可显著提高寻径系统的性能,因为这可以减少人物和其他组件需要在游戏世界中执行这些昂贵测试的次数。
您还可以对 NavMesh 执行高性能空间查询,以使用您自己的代码将经优化的空间化用于自己的目的。请参见使用查询系统。
请注意,上图中 NavMesh 的三角形在不同的区域中标有不同的颜色。这些颜色表示用户定义的不同数据值(称为 NavTag),这些值已指定给三角形以表示不同类型的地形。为角色设置寻径时,可以利用这些标记指定您的角色可以穿越和不可穿越的地形种类,也可以将它们关联到控制角色在这些区域中的路径跟随的智能对象。请参见使用自定义数据进行标记。
NavMesh 中的三角形的海拔高度与地面大致相同。但是,默认情况下,其海拔高度仅确定为地面海拔高度的近似值,足以区分多个重叠的适航区域(如一个建筑物内的多个楼层)。在某些区域,NavMesh 甚至可能在地下穿过。
如果想要依靠 NavMesh 的海拔高度用于其他目的,如在不使用物理系统的情况下使角色贴近地面,您可以配置 NavData 生成系统以提高 NavMesh 跟随地形网格的海拔高度的精度。有关详细信息,请参见提高海拔高度精度。
NavGraph 是由位于 3D 空间中的顶点组成、由多个边连接的空间结构。您可以使用 NavGraph 在 NavMesh 分离区域中的点之间创建新的拓扑连接,如电梯、跳跃点或传送机。NavGraph 通常链接到智能对象,智能对象控制角色穿越边的能力,而且可能完全控制角色穿越边时的移动。请参见创建智能对象。
NavGraph 边可以跨越 NavMesh 的边界,还可能包含 NavMesh 外部的顶点。它们可能只是两个顶点之间的一条边,也可能会形成具有 NavMesh 外导航可能性(如锯齿线)的复杂网络。
例如,在下图中,箭头表示将地面上的点连接到屋顶上的点的 NavGraph 边。这些边可以与智能对象相关联,智能对象通过播放跳跃动画或计算自定义轨迹,管理沿其中一条边规划路径的任何角色的路径跟随。
NavGraph 是 NavMesh 的一项可选增强功能,用户可以在游戏中需要特殊移动类型或智能对象时创建 NavGraph 并将其添加到 NavData。NavData 生成系统不会自己自动创建 NavGraph。您可以自己创建:在数据生成过程中(通常在生成地块的 NavMesh 后运行的后期处理阶段中)创建,或者在运行时动态创建。请参见创建 NavGraph。
上面所述的 NavMesh 和 NavGraph 是您为地形预先生成并在运行时加载到内存中的静态数据结构。但是,在游戏过程中可以通过动态元素丰富和修改每个世界中的静态 NavData,如 TagVolume、BoxObstacle 和 CylinderObstacle。