Unity的NavMeshAgent自动寻路几种判断到达目的地的方式
如何判断NavMeshAgent
到达目的地?
用到的的是NavMeshAgent
的destination
和nextPosition
这两个自带的属性变量。
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
),当角色的碰撞体进入目的地碰撞体,返回一个“已经到达目的地”的指令。
目的地的碰撞体的代码(目的地的碰撞体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的时候,表明寻路组件正在计算路径的坐标点。
通过speedPercent
来判断是否到达目的地
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;
原文章链接
根据原文章进行了一些测试,并加入了一些自己的东西。