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

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

 

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

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

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

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

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

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

    private NavMeshAgent man;
    public Transform target;

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

man = gameObject.GetComponent<NavMeshAgent>();

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

IEnumerator AINavMesh()
    {


        while (true)
        {
           

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



            }
           
                
            
          
             

        


        }
    }
    IEnumerator AIFollowHero()
    {

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

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

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


              
               // transform.LookAt(mage.transform);
                man.isStopped = true;
                transform.GetComponent<Animation>().Play("attack");
                qiang.GetComponent<MeshCollider>().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<Animation>().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游戏那样三路小兵各自走不同路线等等方案。

  • 4
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
NavMeshAgentUnity引擎中的一个组件,用于控制角色的移动和寻路。通过使用NavMeshAgent,开发者可以为角色创建一个导航网格,标记可到达和不可到达的区域,并使角色能够自动寻找最优路径,避免与其他Agent和障碍物发生碰撞。NavMeshAgent组件自带了寻路和空间推理的脚本,可以帮助角色朝着设定的目标移动,并避免与其他Agent相互干扰。 要为角色添加NavMeshAgent组件,可以通过在角色的脚本中添加以下代码来实现:private NavMeshAgent agent;在Unity中,还有一个Unity NavMesh 2D寻路的功能可用于2D游戏的导航和寻路。你可以通过下载一个相关的存储库或将其添加到项目的Package Manager清单中来使用这个功能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Unity3D实用组件:NavMesh Agent](https://blog.csdn.net/float_freedom/article/details/126179067)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [NavMeshPlus:Unity NavMesh 2D寻路](https://download.csdn.net/download/weixin_42129797/15108830)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值