利用U3DNavMeshAgent组件导航创建类似路标功能的实现

  • Post author:
  • Post category:其他


最近做了仿真项目需要做一个路标功能。记录一下实现效果的代码

 //保存旋转角度的列表
    List<Quaternion> rotList = new List<Quaternion>();

    //保存位置坐标的列表
    List<Vector3> posList = new List<Vector3>();

    List<GameObject> golist = new List<GameObject>();
    /// <summary>
    /// 获得拐点位置与旋转然后创建路标的方法(创建路标第二种方法)
    /// </summary>
    void paths()
    {
        //判断物体列表里面有没有物体(当人物没有走到目标点就发生第二次点击时,进入此循环,删除前一条路的路标)
        if (golist.Count > 0)
        {
            for (int i = 0; i < golist.Count; i++)
            {
                Destroy(golist[i]);
            }
            golist.RemoveAll(golist => true);
        }
        //实例化一个新的路径
        NavMeshPath pa = new NavMeshPath();
        //计算新的路径
        agent.CalculatePath(hitpoint, pa);
        //获取所有路径上的拐点
        for (int i = 0; i < pa.corners.Length - 1; i++)
        {
            //获得每两个拐点之间的距离
            float corn = (pa.corners[i + 1] - pa.corners[i]).magnitude;
            //获得每两个点之间的旋转角度(创建物体的时候使用这个角度,使创建的路标一直朝向前方)
            Quaternion roti = Quaternion.LookRotation(pa.corners[i + 1] - pa.corners[i]);
            //控制创建路标的比例(用来判断创建几个路标,默认距离相隔1则创建一个路标)
            float arrjuli = 0;
            //判断创建路标的比例是否大于两个拐点之间的距离并且两个拐点之间的距离必须大于路标之间的间隔
            while (arrjuli < corn && corn > 1)
            {
                //把两个拐点之间的旋转角度按照顺序保存在列表中
                rotList.Add(roti);
                //计算两个拐点之间可以创建几个路标
                float a = arrjuli / corn;
                //求出路标创建的位置(利用差值运算(第一个拐点,第二个拐点,拐点之间距离的比例))
                Vector3 po = Vector3.Lerp(pa.corners[i], pa.corners[i + 1], a);
                //把创建路标点的位置保存在数组中
                posList.Add(po);
                //改变下一个创建路标的位置
                arrjuli += 1;
            }
        }
        //遍历数组的长度
        for (int i = 0; i < posList.Count; i++)
        {
            //根据遍历结果创建路标
            GameObject g = Instantiate(Arrow, posList[i] + transform.up * 0.1f, rotList[i]);
            golist.Add(g);
            StartCoroutine(destroyArrow(g));
        }
        //清空链表中所有数据
        posList.Clear();
        rotList.Clear();
        //posList.RemoveAll(posList => true);
        //rotList.RemoveAll(rotList => true);
    }



版权声明:本文为Plutogd原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。