Unity的NavMeshAgent自动寻路几种判断到达目的地的方式

29 篇文章 10 订阅

如何判断NavMeshAgent到达目的地?

用到的的是NavMeshAgentdestinationnextPosition这两个自带的属性变量。

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)
{
    
}
  • destinationNavMeshAgent组件的目的地;
  • nextPositionNavMeshAgent组件的及时的位置信息。

因为两个向量坐标的精度通常是(17.00001,12.000001,46.0000001),所以无法进行==运算比较。这样就只能相减,判断两点之间的距离。Mathf.Epsilon为最小的正整数常量。有时会由于设备或算法精准度等原因,结果会出现小数点后的微小误差,导致Mathf.Epsilon无法成立,可以根据项目需求进行修改为0.0001f0.001f0.01f等。

NavMeshAgentnav.remainingDistance参数

NavMeshAgentnav.remainingDistance参数作为判断是否到达目的地的参数。

if (Mathf.Abs(aget.remainingDistance) < 0.01f)
{

}
if (aget.remainingDistance < 0.5f)
{

}

NavMeshAgentnav.remainingDistance参数有个局限,不能用于自动烘培
只能使用Unity自带的静态烘培。

碰撞体Collider

在目的地中设置碰撞体(Collider),当角色的碰撞体进入目的地碰撞体,返回一个“已经到达目的地”的指令。
目的地的碰撞体的代码(目的地的碰撞体ColliderIsTriggerTrue,使用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;

原文章链接

根据原文章进行了一些测试,并加入了一些自己的东西。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天富儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值