Version: 2023.1
构建高度网格以准确放置角色
使用附加加载 (Additive Loading) 加载多个导航网格

Navigation Areas and Costs

导航区域 (Navigation Areas) 定义了穿越特定区域的难度,在寻路期间将优先选择成本较低的区域。此外,每个导航网格代理 (NavMesh Agent) 都有一个_区域遮罩 (Area Mask)_,可用于指定代理可以移动的区域。

在上面的示例中,区域类型用于两种常见用例:

  • Water 区域:通过分配更高的成本使该区域的行走成本更高,从而应对在浅水上行走速度较慢的情况。
  • Door 区域:让该区域可由特定角色访问,从而创建人类可以但僵尸不能穿过门的情况。

The area type can be assigned to every object that is included in the NavMesh baking, in addition, each OffMesh Link has a property to specify the area type.

Pathfinding Cost

简而言之,通过成本可以控制寻路器 (pathfinder) 在寻路时优先选择的区域。例如,如果将某个区域的成本设置为 3.0,则意味着跨越该区域的行程将是其他替代路线的三倍。

要完全了解成本的作用,让我们来看看寻路器的工作原理。

在寻路期间访问的节点和链接。
在寻路期间访问的节点和链接。

Unity 使用 A* 计算导航网格上的最短路径。A* 适用于具有连接节点的图形。算法从距离路径起点最近的节点开始访问连接节点,直至到达目标。

由于 Unity 导航表示形式为多边形网格,因此寻路器首先要做的是在每个多边形上放置一个点,这便是节点的位置。随后将计算这些节点之间的最短路径。

上图中黄色的点和线显示了节点和链接在导航网格上的分布情况,以及在 A* 期间遍历这些节点和链接的顺序。

在两个节点之间移动的成本取决于行进距离以及与该链接下的多边形的区域类型相关联的成本,即_距离 * 成本_。实际上,这意味着,如果一个区域的成本为 2.0,则此类多边形的距离将显示为两倍。A* 算法要求所有成本必须大于 1.0。

The effect of the costs on the resulting path can be hard to tune, especially for longer paths. The best way to approach costs is to treat them as hints. For example, if you want the agents to not to use OffMesh Links too often, you could increase their cost. But it can be challenging to tune a behavior where the agents to prefer to walk on sidewalks.

在某些关卡中,您可能会注意到的另一个现象是寻路器并不总是选择最短的路径。此现象的原因在于节点的放置方式。在以下场合中,该现象可能会很明显:大型开放区域与微小障碍物相邻,从而造成导航网格具有非常大和非常小的多边形。在这种情况下,大型多边形上的节点可能放置在大型多边形的任何位置,从寻路器的角度看起来好像是绕行道。

可在 Areas 选项卡中设置每种_区域类型_的_成本_,也可使用脚本根据每个代理覆盖这些设置。

Area Types

The area types are specified in the Navigation (Obsolete) window’s Areas tab. There are 29 custom types, and 3 built-in types: Walkable, Not Walkable, and Jump.

  • Walkable 是一种可行走的通用区域类型。
  • Not Walkable is a generic area type which prevents navigation. It is useful for cases where you want to mark certain objects to be obstacles, but without getting a NavMesh on top of them.
  • Jump is an area type that is assigned to all auto-generated OffMesh links.

如果不同区域类型的多个对象重叠,则生成的导航网格区域类型通常是索引最高的类型。但有一个例外:_Not Walkable_ 始终优先。如果需要阻挡某个区域,此类型可能会有用。

Area Mask

每个代理都有一个_区域遮罩 (Area Mask)_,用于描述代理在导航时可使用的区域。可在代理属性中设置区域遮罩,也可在运行时使用脚本来操作位掩码。

当您希望只有某些类型的角色才能穿过某个区域时,区域遮罩非常有用。例如,在僵尸逃避游戏中,可使用 Door 区域类型来标记每个门下方的区域,并从僵尸角色的 Area Mask 中取消选中 Door 区域。

Additional resources

构建高度网格以准确放置角色
使用附加加载 (Additive Loading) 加载多个导航网格