- 如何判断`NavMeshAgent`到达目的地?
- 用到的的是`NavMeshAgent`的`destination`和`nextPosition`这两个自带的属性变量。
- 用`NavMeshAgent`的`nav.remainingDistance`参数
- 碰撞体`Collider`
- 角色当前的坐标Position_1和目的地的坐标Position_2坐标的差值
- 角色当前的坐标Position_1和目的地的坐标Position_2坐标的矢量值
- `NavMeshAgent`组件的路径`path`变量长度
- 通过`speedPercent`来判断是否到达目的地
- 原文章链接
if ((aget.destination.x - aget.nextPosition.x <= 0.05f)
&& (aget.destination.y - aget.nextPosition.y <= 0.05f)
&& (aget.destination.z - aget.nextPosition.z <= 0.05f))
{
}
或者
if (Vector3.Distance(aget.destination, aget.nextPosition) >= Mathf.Epsilon)
{
}
- destination是NavMeshAgent组件的目的地;
- nextPosition是NavMeshAgent组件的及时的位置信息。
因为两个向量坐标的精度通常是(17.00001,12.000001,46.0000001),所以无法进行==运算比较。这样就只能相减,判断两点之间的距离。Mathf.Epsilon为最小的正整数常量。有时会由于设备或算法精准度等原因,结果会出现小数点后的微小误差,导致Mathf.Epsilon无法成立,可以根据项目需求进行修改为0.0001f、0.001f、0.01f等。
用NavMeshAgent的nav.remainingDistance参数用NavMeshAgent的nav.remainingDistance参数作为判断是否到达目的地的参数。
if (Mathf.Abs(aget.remainingDistance) < 0.01f)
{
}
if (aget.remainingDistance < 0.5f)
{
}
NavMeshAgent的nav.remainingDistance参数有个局限,不能用于自动烘培。
只能使用Unity自带的静态烘培。
在目的地中设置碰撞体(Collider),当角色的碰撞体进入目的地碰撞体,返回一个“已经到达目的地”的指令。
目的地的碰撞体的代码(目的地的碰撞体Collider的IsTrigger为True,使用other.tag == "Player"过滤目标)
public void OnTriggerEnter(Collider other)
{
if (other.tag == "Player")
{
//已经到达目的地
}
}
public void OnTriggerExit(Collider other)
{
if (other.tag == "Player")
{
//离开
}
}
角色当前的坐标Position_1和目的地的坐标Position_2坐标的差值
和最上面的方法差不多,但是有偏差。 把角色当前的坐标Position_1和目的地的坐标Position_2进行比较,两者相差的值,在一个浮动的范围内。
Vector3 pos_ = Positon_1 - Positon_2;
if ((pos_.x < 1) && (pos_.y < 1) && (pos_.z < 1))
{//判断为到达目的地
}
注意 :值要取绝对值。
System.Math.Abs(value);//using System;角色当前的坐标Position_1和目的地的坐标Position_2坐标的矢量值
Vector3 pos_ = Positon_1 - Positon_2;
float f = pos_.magnitude;
if (f < 1.0f)//2个浮点变量进行比较
{//判断为到达目的地
}
NavMeshAgent组件的路径path变量长度
if(aget.path.corners.Length != 1)
{
}
获得角色的NavMeshAgent组件的路径path变量用于存储路径点的三维坐标的数组的长度。
当这个长度等于1的时候,表明角色到达了目的地,当其大于1的时候,表明寻路组件正在计算路径的坐标点。
float speedPercent = 0f;
public void Update()
{
speedPercent = aget.velocity.magnitude / aget.speed;//在Update函数里面进行调用
}
通常speedPercent是控制角色动画,跑步动画、走路动画、待命动画三种不同动画之间的切换设置的条件。
当speedPercent为0,或者是接近于0的时候,说明到达了目的地。
注意:角色在转弯的时候,有可能speedPercent也为0,需要添加一些特定的条件,才能判断是否到达目的地。
public void Update()
{
speedPercent = agent.velocity.magnitude / agent.speed;//在Update函数里面进行调用
Vector3 pos_ = Positon_1 - Positon_2;
float x, y, z;
x = pos_.x; x = System.Math.Abs(x);//using System;
y = pos_.y; y = System.Math.Abs(y);//using System;
z = pos_.z; z = System.Math.Abs(z);//using System;
if ((x < 1) && (y < 1) && (z < 1) && speedPercent == 0)
{//判断为到达目的地
}
}
注意 :值要取绝对值。
System.Math.Abs(value);//using System;原文章链接
根据原文章进行了一些测试,并加入了一些自己的东西。



