U3L20-2——导航网格寻路组件(NavMesh Agent)

导航网格寻路组件

通过上节课导航网格生成知识点的学习
我们已经准备好了地形相关的数据
知道地形上哪些地方可以到达,哪些不能
那么寻路组件的作用就是帮助我们让角色可以在地形上准确的移动起来

寻路组件的本质就是根据烘焙出的寻路网格信息
通过基于A星寻路的算法计算出行进路径让我们在该路径上移动起来

本章代码关键字

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
UnityEngine.AI                    //寻路组件相关命名空间
NavMeshAgent //导航网格寻路组件类
navMeshAgent.SetDestination() //自动寻路设置目标点
navMeshAgent.isStopped //是否停止寻路
navMeshAgent.speed //寻路移动速度
navMeshAgent.acceleration //寻路移动加速度
navMeshAgent.angularSpeed //寻路移动旋转速度
navMeshAgent.hasPath //当前是否有路径
navMeshAgent.destination //代理目标点
navMeshAgent.path //当前路径
navMeshAgent.pathPending //路径是否在计算中
navMeshAgent.pathStatus //路径状态,会返回一个NavMeshPathStatus枚举
navMeshAgent.updatePosition //是否更新位置
navMeshAgent.updateRotation //是否更新角度
navMeshAgent.velocity //代理速度
NavMeshPath //寻路所用的路径类
navMeshAgent.CalculatePath() //计算生成路径
navMeshAgent.SetPath() //设置新路径
navMeshAgent.ResetPath() //清除路径
navMeshAgent.Warp() //调整到指定点位置

寻路组件参数相关

导航网格寻路组件 Nav Mesh Agent(导航网格代理人)

image

  • Agent Type 代理类型
    配合Agents页签使用

  • Base Offset 基础偏移值,相对对象轴心点的高度偏移

  • Steering 移动设置

    • Speed 寻路时的最大移动速度(世界单位/秒)
    • Angular Speed 寻路时转身的最大旋转速度(度/秒)
    • Acceleration 最大加速度(世界单位/平方秒)
    • Stopping Distance 当靠近目标点多少距离时,停止运动
    • Auto Braking 自动制动(减速) 启用后,当到达目标时将减速,如果存在连续移动(比如巡逻移动)建议不要开启该选项
  • Obstacle Avoidance 避障设置

    • Radius 半径,用于计算障碍物和其它寻路对象之间的碰撞
    • Height 高度,通过头顶障碍物时用于计算高度间隙使用
    • Quality 障碍躲避品质,越高躲避障碍越准确,但是性能消耗较大,如果不想主动避开其它动态障碍,可以设置为无,则只会解析碰撞
    • Priority 优先级,0~99, 避障时,数字较小的障碍物表示较高的优先级 优先级低的会忽略避障
  • Path Finding 路径寻找规则

    • Auto Traverse OffMesh Link
      是否开启自动遍历网格外的其它网格连接
      如果要自定义判断,则关闭此功能
    • Auto Repath 是否开启自动重设路线
      如果开启,当到达路径后段时会再次尝试寻路,当没有到达目标的路径时,会生成一条到达与目标位置最近的可达点
    • Area Mask 寻路时,考虑的区域
      如果寻路时不想考虑某些区域,则取消选中
      塔防游戏中常见的功能

寻路组件代码相关

使用网格相关脚本需要引用命名空间 UnityEngine.AI

1
using UnityEngine.AI;

常用内容

自动寻路设置目标点

1
navMeshAgent.SetDestination();

停止寻路

设置为true就停止寻路,如果想恢复为可寻路状态需要重新设置为false

1
navMeshAgent.isStopped = true;

不常用内容

变量

  1. 关键变量

    • 面板参数相关 速度 加速度 旋转速度等等

      1
      2
      3
      print(navMeshAgent.speed);
      print(navMeshAgent.acceleration);
      print(navMeshAgent.angularSpeed);
  2. 其它重要属性

    1. 当前是否有路径

      1
      if (navMeshAgent.hasPath) { }
    2. 代理目标点 可以设置 也可以得到

      1
      print(navMeshAgent.destination);
    3. 是否停止 可以得到也可以设置

      1
      print(navMeshAgent.isStopped);
    4. 当前路径

      1
      print(navMeshAgent.path);
    5. 路径是否在计算中

      1
      if (navMeshAgent.pathPending) { }
    6. 路径状态

      会返回一个NavMeshPathStatus枚举,PathComplete是寻路完成,PathPartial是找到一部分,PathInvalid是无效

      1
      print(navMeshAgent.pathStatus);
    7. 是否更新位置

      1
      navMeshAgent.updatePosition = true;
    8. 是否更新角度

      1
      navMeshAgent.updateRotation = true;
    9. 代理速度

      1
      print(navMeshAgent.velocity);
    10. NavMeshPath路径类

      本质上是由一个Vector3数组和一个Int值组成的

      1
      NavMeshPath path = new NavMeshPath();

方法

  • 手动寻路

    • 计算生成路径

      当返回值为Ture时,该Path计算成功

      1
      if (navMeshAgent.CalculatePath(Vector3.zero, path))  { }
    • 设置新路径

      当返回值为Ture时,说明设置成功

      1
      if (navMeshAgent.SetPath(path)) { }
    • 清除路径

      1
      navMeshAgent.ResetPath();
    • 调整到指定点位置

      1
      navMeshAgent.Warp(Vector3.zero);