栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 游戏开发 > Unity3D

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

Unity3D 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

Unity的NavMeshAgent自动寻路几种判断到达目的地的方式
    • 如何判断`NavMeshAgent`到达目的地?
      • 用到的的是`NavMeshAgent`的`destination`和`nextPosition`这两个自带的属性变量。
      • 用`NavMeshAgent`的`nav.remainingDistance`参数
      • 碰撞体`Collider`
      • 角色当前的坐标Position_1和目的地的坐标Position_2坐标的差值
      • 角色当前的坐标Position_1和目的地的坐标Position_2坐标的矢量值
      • `NavMeshAgent`组件的路径`path`变量长度
      • 通过`speedPercent`来判断是否到达目的地
    • 原文章链接

如何判断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;
原文章链接

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/900335.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号