最简单的寻路系统

介绍

  • 导航系统能帮助我们从出发点到达 目的地。
  • 从 A 点到 B 点可能有 N 条路,导航系统会帮我们选出最快捷最方便的那条路。现实生活中的导航系统是这样的,虚拟世界中的导航系统同样也是这样的。
  • Unity 中的导航系统是由“A*算法”延伸扩展实现的。
    具体实现可以参考我之前的文章:https://www.lengyueling.cn/archives/33

步骤

  • 将地面或者障碍物标记为static
  • 打开Navigation窗口并对导航场景进行烘培
  • 给需要寻路的物体加入NavMeshAgent组件
  • 编写寻路脚本:
    • using UnityEngine;
      using UnityEngine.AI;//NavMeshAgent依赖的命名空间
      public class PlayerNav : MonoBehaviour
      {
          public NavMeshAgent navMeshAgent;
          public Transform endTransform;
          void Start()
          {
              //设置寻路终点(两种方法均可)
              //通过方法设置
              //navMeshAgent.SetDestination(endTransform.position);
              //通过属性设置
              navMeshAgent.destination = endTransform.position;
          }
      }
      

组件中各个变量说明详见官方文档:https://docs.unity3d.com/Manual/class-NavMeshAgent.html

属性 功能
Agent Size 代理器的大小
Radius 代理的半径,用于计算障碍物与其他代理之间的碰撞。
Height 代理通过头顶障碍物时所需的高度间隙。
Base offset 碰撞圆柱体相对于变换轴心点的偏移。
Steering 操作
Speed 最大移动速度(以世界单位/秒表示)。
Angular Speed 最大旋转速度(度/秒)。
Acceleration 最大加速度(以世界单位/平方秒表示)。
Stopping distance 当靠近目标位置的距离达到此值时,代理将停止。
Auto Braking 启用此属性后,代理在到达目标时将减速。对于巡逻等行为(这种情况下,代理应在多个点之间平滑移动)应禁用此属性
Obstacle Avoidance 避障
Quality 障碍躲避质量。如果拥有大量代理,则可以通过降低障碍躲避质量来节省 CPU 时间。如果将躲避设置为无,则只会解析碰撞,而不会尝试主动躲避其他代理和障碍物。
Priority 执行避障时,此代理将忽略优先级较低的代理。该值应在 0–99 范围内,其中较低的数字表示较高的优先级。
Path Finding 路径查找
Auto Traverse OffMesh Link 设置为 true 可自动遍历网格外链接 (Off-Mesh Link)。如果要使用动画或某种特定方式遍历网格外链接,则应关闭此功能。
Auto Repath 启用此属性后,代理将在到达部分路径末尾时尝试再次寻路。当没有到达目标的路径时,将生成一条部分路径通向与目标最近的可达位置。
Area Mask Area Mask 描述了代理在寻路时将考虑的区域类型。在准备网格进行导航网格烘焙时,可设置每个网格区域类型。例如,可将楼梯标记为特殊区域类型,并禁止某些角色类型使用楼梯。

https://docs.unity3d.com/cn/current/ScriptReference/AI.NavMeshAgent.html

https://github.com/Unity-Technologies/NavMeshComponents

Bake栏

BakeAgentSize

属性 功能
Agent Radius 代理器半径,烘焙出来的网格和障碍物之间的空隙。
Agent Heigh 代理器的高度,当场景中的导航出现上下层的时候。当楼层与楼层之间的距离比 Agent Height 的高度还要小的时候,这个区间内就不会生成导航网格。
Max Slope 最大爬坡能力。
Step Height 当场景中出现台阶的时候,控制多高的台阶角色可以导航,但是这个台阶的高度不能高于 Agent Height 的高度。
属性 功能
Drop Height 在多高的落差之间生成跳跃线,指的是垂直方向,默认值为 0,表示该选项无效;生成的跳跃线是单向的,高处往低处跳跃。
Jump Distance 在多远的距离之间生成跳跃线,指的是垂直方向,默认值为 0,表示该选项无效;这时生成的跳跃线也是单向的,但是,距离方向的跳跃线往往是成组生成,所以还是可以双向移动的。

Object栏

属性 功能
Navigation Static 当前模型是否参与了“导航系统”
Generate OffMeshLinks 生成“网格跳跃线”
Navigation Area 导航区域,定义当前区域的地形,在Areas栏中可以设置不同地形的花费

OffMeshLink组件

组件中各个变量说明详见官方文档:https://docs.unity3d.com/cn/current/Manual/class-OffMeshLink.html

属性 功能
Start 描述网格外链接起始位置的对象。
End 描述网格外链接起始位置的对象。
Cost Override 定义角色通过这个“跳跃线”所要付出的代价是多少。默认值是-1,代表角色通过该跳跃线不需要代价。注意:这里的代价覆盖的是“Navigation Area”参数指定的地形代价。
Bi-Directional 如果启用此属性,则可以在两点上来回跳跃。否则,只能按照从StartEnd 的方向遍历链接。
Activated 指定寻路器 (pathfinder) 是否可用
Auto Update Positions 如果启用此属性,当端点移动时,网格外链接将重新连接到导航网格。如果禁用,即使移动了端点,链接也将保持在其起始位置。
Navigation Area 如果勾选该参数,则表示自动更新位置,我们在运行状态的时候,是可以动态的改变开始点或者结束点的位置的,同时跳跃线也会动态的更新,反之亦然。

组件中各个变量说明详见官方文档:https://docs.unity3d.com/cn/current/Manual/class-NavMeshObstacle.html

属性 功能
Shape 障碍物几何体的形状。选择最适合对象形状的选项。
Box
Center 盒体的中心(相对于变换位置)。
Size 盒体的大小。
Capsule
Center 胶囊体的中心(相对于变换位置)。
Radius 胶囊体的半径。
Height 胶囊体的高度。
Carve 勾选 Carve 复选框后,这是一个障碍物,不勾选则是一个colider。
Move Threshold 当导航网格障碍物的移动距离超过设置的值时,Unity 会将其视为移动状态。
Time To Stationary 障碍物位置检查的时间频率(以秒为单位)。
Carve Only Stationary 启用此属性后,按照上面的时间间隔固定的检查位置,否则每一帧都更新网格数据。