本节主要学习的是NavMeshAgent的使用,这个是unity自带的寻路组件。
首先我们来看看场景文件夹结构。
这里写图片描述
没错,就是这么简单,只有一个场景和一个脚本。

1、打开test场景
我们打开test场景,即可看到:
这里写图片描述
我们的是一个平面,上面是有若干个cube或这胶囊体。

2、设置能行走的层,标记为static。
这个场景里我们认为Cube1、Cube2、Cube3、Cube4是可以行走的,所以我们将其static设置为:
这里写图片描述

3、烘焙导航网格
点击unity的Window->Navigation,然后跳转到Bake页签,可以看到:
这里写图片描述
我们点击Bake即可得到导航网格了。
这里写图片描述

以上所有的操作都是默认设置,暂时没有调整任何的烘焙参数。

4、编写脚本,让其自动寻路
这里写图片描述
场景中的actor为胶囊体,为其添加一个NavMeshAgent组件,然后我们看看其中的代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
using UnityEngine.SceneManagement;

public class Run : MonoBehaviour
{
    public Transform m_target;

    public NavMeshAgent m_angent;
    private NavMeshHit hit;

    private AssetBundle bundle;

    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            RaycastHit hit;
            if (Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition), out hit, 100))
            {
                m_angent.destination = hit.point;
            }
        }

        if(Input.GetKeyDown(KeyCode.A))
        {
            SceneManager.LoadScene("NavMeshData", LoadSceneMode.Additive);
        }
    }
}

我们暂且不看LoadScene的那行代码:SceneManager.LoadScene(“NavMeshData”, LoadSceneMode.Additive);
直接运行游戏就可以鼠标点到哪里就可以寻路到哪里了。

下面我们做的操作就是,能不能将NavMesh分开,动态的加载进来呢,我们试图打包NavMesh为bundle然后加载进来,但是实验之后没有成功,经过查询,我们得知NavMesh是和场景相互关联的,那么我们试图把NavMesh作为单独的场景一Additive的方式加载进来,看看是否可以自动寻路了。

那么此时的问题就在于,新建立一个场景,把test场景中的物体都拷贝到新场景,然后做烘焙导航网格处理,之后,我们留下NavMesh,并且把新场景中的物价全部删除掉,这样我们在LoadLevel以追加的方式load新场景之后,此时NavMesh就被加载进内存了。

我们照此办法,新建立场景NavMeshData场景,然后把test场景中的物体全部拷贝进去,得到:
这里写图片描述

然后删除NavMeshData场景中的所有物体,留下一个空场景即可。
这里写图片描述

然后就有了上面的一段加载NavMeshData场景的代码:

 if(Input.GetKeyDown(KeyCode.A))
        {
            SceneManager.LoadScene("NavMeshData", LoadSceneMode.Additive);
        }

这样,我们将原来的test的NavMesh删除掉,运行test场景,并按下键盘A,那么此时就可以正常寻路了。

那么有人好奇的问,如果没有NavMesh,那么结果是怎样的呢?我们不妨,运行Test场景,但是不加载NavMeshData场景,此时console面板会出现下面的错误:
“SetDestination” can only be called on an active agent that has been placed on a NavMesh.
这里写图片描述

这个错误就是因为没有导航网格导致的问题。

至此,我们初步的NavMesh的动态加载以及NavMeshAgent的寻路就暂告一段落了。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建,欢迎商务合作。wx: diudiu5555

更多推荐