Unity NavMeshAgent组件
LuJack
编辑于 2023年12月03日 15:17
收录于文集
共90篇

NavMeshAgent组件是角色导航的必要组件,添加给角色后,可以让角色根据导航网格的信息,自动导航移动到指定的位置。

NavMeshAgent组件本质上是通过A星寻路算法计算出路径,再让角色在该路径上移动。

在使用NavMeshAgent组件之前,应确保已经烘焙出了导航网格区域,这样才可能成功导航。

烘焙导航网格要使用NavMeshSurface组件。

添加了NavMeshAgent组件的游戏对象不会参与导航网格的烘焙。

导航如何走,如何避开障碍物,实质上是用一个圆柱体来计算的,这个圆柱体叫做代理,可以在Navigation窗口的Agents选项卡中设置代理的参数。

Agent Type

    使用哪一种代理来进行导航移动。

    代理可以在Navigation窗口的Agents选项卡中设置。

Base Offset

    代理的偏移量。

    这个值越大,代理的圆柱体越往上。这个值越小,代理的圆柱体越往下。

Speed

    导航时角色移动的最大速度,单位是米/秒。

    刚开始移动时角色的移动速度是0,然后会慢慢增加,最后到达这个参数的值,以这个参数的值为移动速度来移动。

Angular Speed

    导航时角色旋转自身的最大速度,单位是度/秒。

    在导航的时候,如果角色的Z轴没有朝向目标点,则角色会自动转身,使得自身Z轴朝向目标点。

    这个参数的值越大,则转身的速度就越大。

Acceleration

    导航时角色移动的加速度,单位是米/平方秒。

    这个参数的值越大,则角色的移动速度就变化得越快,会更快到达参数Speed的值,最后以参数Speed的值为移动速度来移动。

Stopping Distance

    代理到目标点多远的距离就算到达了目的地。

Auto Braking

    勾选后,当代理到达目标点Stopping Distance米的地方就会减速然后慢慢停下来。

    不勾选,则即使代理到达Stopping Distance米的地方也会一直抖动,导航移动并没有结束。

Radius

    代理的圆柱体的半径。

Height

    代理的圆柱体的高度。

Quality

    选择品质越高,则躲避障碍物越准确,但同时消耗的性能也越大。

    如果选择None,则代理不会主动避开其它代理和障碍物,但仍然会与它们碰撞。

Priority

    这个代理避开其它代理的优先级。

    这个代理会优先避开本参数较小的其它代理。

    取值范围是[0,99]

Auto Traverse OffMesh Link

    勾选后,角色导航移动可以正常通过网格跳跃线。

    不勾选,则角色导航移动要通过网格跳跃线时,会卡住不动,此时也无法移动到其它目标点。当我们再次被本参数勾选上,角色才会正常通过网格跳跃线。

    当我们的角色在通过网格跳跃线时需要执行一些额外的逻辑,例如播放指定的动画等,我们就可以先不勾选本参数,当角色准备通过网格跳跃线,就用代码让它播放指定的动画,然后再勾选本参数,则就能让角色一边播放动画一边通过网格跳跃线了。

Auto Repath

    无论是否勾选本参数,当角色在导航寻路中发现无法直接到达目标位置时,Unity会生成一条部分路径,让角色导航移动到一个距离目标位置最近的可到达的位置。

    勾选本参数,则当角色在到达部分路径的终点,导航移动不会结束,角色会不断尝试移动向目标位置。

    不勾选本参数,则当角色在到达部分路径的终点,导航移动就会结束。

Area Mask

    角色在导航移动时能通过的区域。

    勾选的区域表示这个代理会考虑通过它。

    如果想让代理绝不通过某些区域,则可以不勾选该区域。

必须引入命名空间:using UnityEngine.AI;

NavMeshAgent对象.SetDestination(Vector3对象目标点的世界坐标);

只要执行一次这个方法,角色就会持续导航到目标点

等价于NavMeshAgent对象.destination=Vector3对象目标点的世界坐标;

如果在角色导航的途中,目标点也移动了,则角色不会跟随目标点移动。此时应重新调用这个方法

NavMeshAgent对象.isStopped

值为true则会停止导航的移动。此时即使再执行SetDestination方法也不会移动,必须把这个值设置会false才能重新恢复导航的移动。

NavMeshAgent对象.remainingDistance

返回float对象,表示角色与导航的目标点之间的距离

NavMeshAgent对象.hasPath

当前是否有到达目标点的路径。

NavMeshAgent对象.destination

返回要移动到的目标点。

NavMeshAgent对象.path.corners

返回当前要移动到目标点的路径,这个路径是一个Vector3的数组,由一个个点构成,每一个点都是一个Vector3型的变量。

NavMeshAgent对象.path.status

返回NavMeshPathStatus枚举。表示寻路是否成功。

NavMeshPathStatus.PathComplete表示寻路成功。

NavMeshPathStatus.PathPartial表示只寻路到了一部分路径。

NavMeshPathStatus.PathInvalid表示寻路失败,完全没法走。

NavMeshAgent对象.pathPending

bool型。表示当前路径是否在计算中。

NavMeshAgent对象.pathStatus

返回NavMeshPathStatus枚举。表示寻路是否成功。

NavMeshPathStatus.PathComplete表示寻路成功。

NavMeshPathStatus.PathPartial表示只寻路到了一部分路径。

NavMeshPathStatus.PathInvalid表示寻路失败,完全没法走。

NavMeshAgent对象.updatePosition

bool型。设置为false则不会自动更新位置,也就是说此时SetDestination方法虽然可以确定移动路径,但是角色不会自动移动过去。设置为true之后角色才会自动移动过去。

NavMeshAgent对象.updateRotation。

bool型。设置为false则不会自动更新角度,也就是说此时角色不会旋转自身使得Z轴朝向目标点。设置为true才会自动转过去朝向目标点。

NavMeshAgent对象.updateUpAxis

bool型。设置为true,则导航代理局部空间的Y轴会与导航网格的局部空间的Y轴或它所在的链接对齐。设置为false,则可以不对齐。

NavMeshAgent对象.velocity

返回Vector3型。表示导航代理器圆柱体的移动速度。

NavMeshAgent对象.CalculatePath(Vector3 目标点,NavMeshPath 存储到的对象)

返回bool型。如果返回true,则表示计算了从当前位置到目标点的路径,并存储到NavMeshPath对象中。对NavMeshPath对象进行操作,则可以用于手动寻路,

NavMeshAgent对象.SetPath(NavMeshPath 路径)

返回bool型。如果返回true,则会设置指定的路径为要移动的路径。

NavMeshAgent对象.ResetPath()

清除路径。

NavMeshAgent对象.Warp(Vector3 目标点)

使角色瞬移到目标点。