[Unity3D]Navigation导航系统讲解及其应用

目录

序言

一、Navigation的基础介绍

二、场景搭建

三、场景烘焙搭建 

四、物体Nav Mesh Agent说明

五、Nav Mesh Areas 与 Agents

 

七、Nav Mesh Obstacle介绍

八、最后一项——实例

 

九、最最最后一项——收工 

序言

        首先啊,说一哈Navigation导航系统,这是Unity3D中自带的一个组件。使用这个,可以轻松实现AI自动寻路。

        当然啦,除去Navigation,比较著名的还有A*导航,但受限于篇幅(和作者的懒惰),先不提它。

一、Navigation的基础介绍

        首先是它的组件位置

        然后里面会有三个组件

         

 Nav Mesh Agent:物体的导航组件,放在需导航物体上

 Nav Mesh Obstacle:可以理解为障碍物

 Off Mesh Link会在后面详细介绍。

接着是他的窗口位置

  

二、场景搭建

        不多说了,直接上图

 

 

应该都看的懂

三、场景烘焙搭建 

 首先的首先,一定要把场景Static打开,静态才能导航烘焙!!!

        打开Navigation窗口

说一下里面的参数意义:

Agent Radius:距离边界的半径距离

Agent  Height:  可以通行的最大高度

Max Slope:物体爬坡的最大角度

Step Height:爬台阶的最大高度

Drop Height:最大下落高度,就是你从坡坡上头跳下来的最大高度

Jump Distance:最大跳跃距离,就是从坡坡这头跳到坡坡那头的最大距离

还有,每次改变场景就要重新渲染一次!

四、物体Nav Mesh Agent说明

        首先,先说哈物体组件的参数:

        

(不知道为什么上传的时候就模糊了)

还是先说说参数含义:

Agent Type:可以理解为物体的导航类型,可以在Navigation窗口更改

Speed:物体移动的最大速度(说最大速度是因为它存在一个加速过程)

Angular Speed:角速度,就是物体旋转的速度,高中讲过

Acceleration:最大加速度,说最大是因为它的速度与时间不成线性关系

Stopping Distance:制动距离,到达后距离目的点的距离

Auto Braking:到达后是否直接停止,就是你勾了这个选项就会有缓冲

Radius:躲避障碍物的半径

Height:同理,躲避障碍物的高度(光说不好理解,可以去改改参数自己看效果)

Quality: 物体躲避的品质,这个的选择与性能挂钩

其余的啊基本不需要去改它。
 

五、Nav Mesh Areas 与 Agents

 

Agents
Areas

 

 Agents:物体移动的属性

与前面讲的差不多,可以对照着看

Areas:导航网格的区域。

主要是后面的Cost。这是根据最短价格寻找路径。

六、Off Mesh Links

这个主要是为了添加导线,在场景中会出现一些绕路的情况,为此,会使用这个组件来解决这个问题。

先看图

这里有两个坨坨,我们上不去,但偏偏就想上去。

那么……

 

就像这样,两个就被连起来了。

可以实现两地的连接。

七、Nav Mesh Obstacle介绍

Shape:模式选择,有方块和胶囊两个选项。

Center与Size:就是阻挡箱的大小。

Carve:是否重新渲染,如果障碍物是实时运动的,那就不要选,不然消耗资源 。

八、最后一项——实例

先说一下代码中的一些方法:
Move :移动到相对于当前位置的点,可以理解为矢量叠加
ResetPath :清除当前选择的路径
SetDestination :设置目标点,并计算出最优路径
SetPath :设置一条路线
Warp :瞬移到某点,目标点用位矢表示

 注意:要先引用 AI模块。

using UnityEngine;
using UnityEngine.AI;


public class PlayerScript : MonoBehaviour
{
    public NavMeshAgent player;
    public LineRenderer lineRenderer;
    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            Vector3 Mouse = Input.mousePosition;
            Ray ray = Camera.main.ScreenPointToRay(Mouse);
            RaycastHit hit;
            if(Physics.Raycast(ray,out hit))
            {
                player.SetDestination(hit.point) ;
                Vector3[] path = player.path.corners;
                for(int w = 0; w < 2; w++)
                {
                    for (int i = 0; i < path.Length; i++)
                    {
                        path[i] = path[i] + new Vector3(0, 1, 0);
                    }

                    lineRenderer.SetVertexCount(path.Length);
                    for (int i = 0; i < path.Length; i++)
                    {

                        lineRenderer.SetPosition(i, path[i]);
                    }
                }
                
            }
            
        }
    }
}

 

        我也让它实现了画出即将走的路线,也使用了Ray的探测。

这个只能作为例子,还有很多可以添加的地方。

九、最最最后一项——收工 

           很完美,又搞完了。

这篇讲的U3D,希望我们共同进步。

感谢读者朋友些。

转载要说哈。 

 

猜你喜欢

转载自blog.csdn.net/LBCLBC666/article/details/126172935