[Unity][NavMeshAgent]怎么计算角色走过的路程长度

 

1.确定路程长度,得获得 2个座标点,起点 和 终点。

float f = Vector3.Distance(a,b);

2.对累计走过得长度进行累加

float distance += f;

 

这个条件得在什么情况下,计算累计行走得长度?

当角色开始移动,移动得速度从0-1得时候,到达目的地 才进行累加。

player_go.transform.GetComponent<NavMeshAgent>().path.corners

是NavMeshAgent组件累计行走得时候 把所有得路径得点得座标放入其中。

 

获得NavMeshAgent导航座标Vector3数组

player_go.transform.GetComponent<NavMeshAgent>().path.corners;

 

这三者的值 都是 相同的。

player_go.transform.position;//玩家控制的角色的世界座标点
player_go.transform.GetComponent<NavMeshAgent>().nextPosition;//
player_go.transform.GetComponent<NavMeshAgent>().path.corners[0];

 

 

 

...
using UnityEngine.AI;
class...
{
...
    private NavMeshAgent agent;
    private float walkDistance =0;//总共行走得距离
    private float distance = 0;//两点之间 暂时得距离
    public Vector3[] vector3s;//player_go.transform.GetComponent<NavMeshAgent>().path.corners用于观察这个数组是如何运行得

    int cornersLength = 0;//长度
    private int isReachDestination = 0;//
    private float speedPercent = 0;//角色 得移动速度
    private  Vector3 nextPos;


    public List<Vector3> list_distance = new List<Vector3>();//using System.Collections.Generic;
...
    start()
    {
    ...
        agent = GetComponent<NavMeshAgent>();
        walkDistance = 0;
    ...
    }//start()
    ...

    update()
    {
        ...
        vector3s = agent.path.corners;
        cornersLength = vector3s.Length;

        if (player_go != null
            && player_go.transform.GetComponent<NavMeshAgent>() != null)
        {
            agent = player_go.transform.GetComponent<NavMeshAgent>();
            speedPercent = agent.velocity.magnitude / agent.speed;//在Update函数里面进行调用
        }//
        ...
        nextPos = agent.nextPosition;//角色当前的及时座标
        if (speedPercent == 0
            && Input.GetMouseButtonDown(0))//当角色的速度为0,鼠标点击左键的时候
        {
            list_distance.Add(nextPos);//行走路径数组 添加起始出发点 座标
        }
        if (cornersLength >= 2)//当NavMeshAgent导航路径点数组,开始导航,角色开始移动
        {
            Debug.Log("======================>>>>>>>");
            distance = Vector3.Distance(agent.path.corners[1],//判断角色的下一个 途中 路径点的座标 
                   agent.path.corners[0]);//判断 角色当前的座标
            //distance的差值 可以随时调整,误差值过大会影响效果
            Debug.Log("======================>>>>>>>"+ distance);
            if (distance < 1.8f)//角色移动已经到达 其中的路径点的座标
                list_distance.Add(agent.path.corners[0]);//行走路径数组 路径点 座标

        }
    ...
    }//update()

...
}//class

通过update函数里面vector3s = player_go.transform.GetComponent<NavMeshAgent>().path.corners;

来观测 这个corners是如何工作的,当角色 使用NavMeshAgent 进行导航,目的地座标有多个 拐点的时候,vector3s[0]和vector3s[1]

player_go.transform.GetComponent<NavMeshAgent>().path.corners[0]

和player_go.transform.GetComponent<NavMeshAgent>().nextPosition永远是当前角色的座标。transform.position

 

当鼠标点击一次的时候,获得 移动路径点的数组

判断nextpos是否与 已经获得的 移动路径点的数组 中的某个 路径点座标 相同,如果相同 就 把上一个 路径点的座标与nextpos的距离 进行判断。

 

判断当前角色的及时 世界座标与 路径点数组 中的 下一个路径点的 座标 是否 接近,

如果是,就把 下一个路径点的 座标 放入 走过的 所有 座标数组List<Vector3>list_distance 中。

获得 总共行走的 路程 遍历 数组list_distance中的 座标点,并且用Vector3.Distance(pos1,pos0);进行计算即可。

 

...

        if (speedPercent == 0
            && Input.GetMouseButtonDown(0))//当角色的速度为0,鼠标点击左键的时候
        {
            list_distance.Add(nextPos);//行走路径数组 添加起始出发点 座标
        }
        if (cornersLength >= 2)//当NavMeshAgent导航路径点数组,开始导航,角色开始移动
        {
            //Debug.Log("======================>>>>>>>");
            distance = Vector3.Distance(agent.path.corners[1],//判断角色的下一个 途中 路径点的座标 
                   agent.path.corners[0]);//判断 角色当前的座标
            //distance的差值 可以随时调整,误差值过大会影响效果
            //Debug.Log("======================>>>>>>>"+ distance);
            if (distance < 1.8f)//角色移动已经到达 其中的路径点的座标
            {
                index++;
                list_distance.Add(agent.path.corners[1]);//行走路径数组 路径点 座标
                walkDistance = walkDistance + distance;
                Debug.Log("          ========== distance: " + distance+"///"+ walkDistance);
            }

        }
...

 

 

相关资料:

1.[Unity]NavMeshAgent自动寻路判断到达目的地

2.

 

参考资料:

1.unity 两点之间的距离

2.NavMeshPath.corners

3.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章