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 目标点)
使角色瞬移到目标点。