unity 自動尋路

以夢為馬,不負韶華發表於2018-10-28

在專案開發中有時候,會用到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

相關文章