unity 自动寻路

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yu1368072332/article/details/82980060

在项目开发中有时候,会用到unity自带的自动寻路系统NavMesh,今天就说下他的简单用法,NavMesh就是将游戏场景中复杂的结构组织关系简化为带有一定信息的网格,进而在这些网格的基础上通过一系列的计算来实现自动寻路,在导航中,只需要给导航物体挂载到导航物体上,导航物体便会自行根据目标点来寻找符合条件的路线,并沿着该路线行进到目标点。

一、实现物体通过自动寻路移动到指定地点

1.首先就是编辑一个简易的场景:

2.选中场景中的对象物体,将Static设置为Navigation Static复选框,unity就会通过选中的对象生成导航网格:

3.选择菜单栏中的Window--->Navigation命令,弹出Navgation视图。然后选择Navgation视图中的Bake按钮生成导航网格

4.就会生成相应的bake信息,其中蓝色区域就是可以进行移动的区域:

5.创建一个可移动的物体,这里就用一个胶囊体代替,为其添加NavMesh Agent组件,下面讲解一下这个组件的具体信息:

Base offset                与地面偏移高度
speed                        移动速度
Angular Speed             转角速度 ,转身速度    角速度: 最高转速(度/秒)。
Acceleration                 加速度,启动时的 最大加速度。
Stopping Distance         停止距离 ,,制动距离:制动距离。到目的地的距离小于这个值,代理减速。
Auto Traverse OffMesh Link 自动遍历OffMesh链接:自动移动并关闭OffMeshLinks
Auto Repath                 自动重新寻路:如果现有的部分已失效,获得新的路径。
Height                         高度:代理的高度(用于调试图形)。
Base offset                   基本偏移:碰撞几何体相对于实际几何体垂直的偏移。
Obstacle Avoidance Type 障碍躲避类型 :躲避的质量水平。
NavMesh Walkable          导航网格行走:指定代理可以遍历的导航网格层类型。这个参数很有用,在接下来的实例中可以用到。

6.为胶囊体添加移动脚本,通过鼠标点击移动到指定地点,代码如下:

    public Camera camera;  //相机    
    private NavMeshAgent navMeshAgent;

    // Use this for initialization
    void Start()
    {
        navMeshAgent = GetComponent<NavMeshAgent>();
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            if (navMeshAgent != null)
            {
                //获取从主相机发出的一条射线
                Ray mRay = Camera.main.ScreenPointToRay(Input.mousePosition);
                RaycastHit mHit;
                if (Physics.Raycast(mRay, out mHit))
                {
                    //当碰撞到Terrain使获取到当时的位置
                    if (mHit.collider.gameObject.tag == "Player")
                    {
                        navMeshAgent.destination = mHit.point;
                    }
                }                              
            }
        }
    }

具体效果:

备注:如果想实现可以直接跳跃到指定的目标位置处,可以设置Drop和Jump Distance,然后重新Bake就可以了:

二、实现不同物体,沿自己的专有道路移动到指定位置

1.搭建自己想要的场景信息:

2.像上面的方式一样,对所有路径进行bake处理,但是唯一不同的需要设置不同的Layer,这里我们设置三个不同的layer

3.先为不同的路径设置对应的layer

4.为不同的移动的物体设置对应的layer:

5.然后添加移动代码:

    public GameObject TargetGo;
    public GameObject[] Solider;

    // Use this for initialization
    void Start()
    {
        for (int i = 0; i < Solider.Length; i++)
        {
            Solider[i].GetComponent<NavMeshAgent>().destination = TargetGo.transform.position;            
        }
    }

6.移动效果

想了解更多相关信息,可以关注下方公众号或者QQ群:879354767

猜你喜欢

转载自blog.csdn.net/yu1368072332/article/details/82980060