关于Unity navMeshAgent自动寻路的停止和更新问题

这两天可把我愁死,明明是一个很简单的问题,没有去了解基础实质,只想着快点做完果然很耽误事,也是把解决办法分享出来,办法很low欢迎交流。

 

关于Unity navMeshAgent自动寻路的停止和更新问题_第1张图片

哪个物体需要寻路就在哪个物体上加一个Nav Mesh Agent组件,主要介绍一下steering下的参数,一个是寻路速度,最大的加速度,角速度,以及制动距离。这几个参数可以让你的寻路更加的圆滑,推荐大家自己去调的时候用一下。

使用前需要对场景先进行烘焙

在“Window”-“Navigation”,打开“Navigation”窗口

关于Unity navMeshAgent自动寻路的停止和更新问题_第2张图片

选中你选则不允许通过的地方,例如我场景中的栏杆等,在选上你可以通过的地方,,在“Navigation”里选中“Bake”面板进行烘焙

如果不做跳跃的话,Generate offMeshLinks是不用勾选的。

然后就是代码部分了(代码写在你需要寻路的物体上)

    private NavMeshAgent man;
    public Transform target;

首先要定义一个NavMeshAgent的变量出来,还有一个目标点的变量。

man = gameObject.GetComponent();

在start函数中为这个变量赋值,

IEnumerator AINavMesh()
    {


        while (true)
        {
           

            if (mage != null && Vector3.Distance(transform.position, mage.gameObject.transform.position) > 5f)
            {
                man.SetDestination(target.position);
                transform.GetComponent().Play("run");//播放角色行走动画 
              
                //启用血条脚本
                gameObject.GetComponent().enabled = true;
                mage.gameObject.GetComponent().enabled = true;
                //() transform.LookAt(mage.transform);没意义
                yield return StartCoroutine(AIFollowHero());



            }
           
                
            
          
             

        


        }
    }
    IEnumerator AIFollowHero()
    {

        while (true)
        {
            /* if (mage != null)
              {
                  transform.LookAt(mage.transform);
                  transform.GetComponent().Play("run");//播放角色跑动画 
                  Vector3 dir = mage.transform.position - transform.position;

                  transform.Translate(dir.normalized * Time.deltaTime * speed * 0.8f, Space.World);
              }

                */
            transform.GetComponent().Play("run");
            if (mage != null && Vector3.Distance(transform.position, mage.gameObject.transform.position) <= 1.5f)
            {


              
               // transform.LookAt(mage.transform);
                man.isStopped = true;
                transform.GetComponent().Play("attack");
                qiang.GetComponent().enabled = true;
                i = 1;
                yield return new WaitForSeconds(2f);


            }
            else if (mage != null && Vector3.Distance(transform.position, mage.gameObject.transform.position) > 1.5f)
            {

                //transform.LookAt(mage.transform);
                // transform.GetComponent().Play("run");//播放角色跑动画 
                 man.isStopped=false;
                man.SetDestination(target.position);
               
            }
          

            transform.LookAt(mage.transform);
           yield return new WaitForEndOfFrame();

        }
    }

 

直接说第二个协程,这里其实是一个距离判断,到了主角身边时要停止寻路,不然会一直撞上主角,因为它其实一直想走到主角脚下踩得位置,从而很违和,当主角远离它时,要把停止关闭,并重新设置主角当前位置为目标点,不然小兵不会刷新目标位置。

这里的man.isStopped是某个版本之后更改的API,之前应该是man.Stop();关闭,man.Resume();开启。当然,还存在着很多例如清除当前路径等等函数,这个对应自己需求去查API即可,网上还有很多教程,寻路的时候还可以实现MOBA游戏那样三路小兵各自走不同路线等等方案。

你可能感兴趣的:(unity)