03、NavMesh--導航網格尋路


一、概述:

NavMesh是3D游戲世界中用於實現動態物體自動尋路的一種技術,他將游戲場景中復雜的結構組織關系簡化為帶有一定信息的網格,

進而在這些網格的基礎上通過一些列的計算來實現自動尋路。

 

二、簡單的應用

1、在場景中搭建以下模型;

 

                          

 

2、選中這三個物體,在Inspector面板中的右上角的Static旁的小三角中選中Navigation Static,切記,一定要選擇這個,不然不能正確的渲染導航網格。

 

                                

 

3、接下來打開Navigation視圖(Window-->Navigaion),單擊Navigation視圖中右下角的Back按鈕來進行導航網格的生成,其中藍色的便是生成的導航網格。

 

                              

 

4、這樣我們的導航網格就完工了,那么接下來我們添加一個主角,並為其添加導航組件(Nav Mesh Agent),這時在在主角上會出現綠色的包圍圈。

 

5、再在場景中添加一個Target物體,讓我們的主角來朝向其運動,來觀察導航是如何實現的。

 

                             

 

6、在主角的物體上添加以下腳本,用來控制其向Target的運動。

 

 1 using System.Collections;
 2 using System.Collections.Generic;
 3 using UnityEngine;
 4 using UnityEngine.AI;
 5 
 6 public class Run : MonoBehaviour
 7 {
 8 
 9     public Transform target;
10     void Start()
11     {
12         GetComponent<NavMeshAgent>().destination = target.position;
13     }
14 
15 }

 

7、將Target物體拖動到腳本中的屬性中,完成賦值。點擊運行游戲,既可以看到主角在朝向Target運動了。

 

8、如果想要主角可以從底下通過,以最少的路徑找到Target,則可以設置主角的Navigation-->Bake-->Agent Height的值,

如果通過Bake可以在橋底下看到有藍色的顯示,則運行游戲主角就可以從橋底穿過了

 

9、如果想要主角可以從上面直接跳下來的話,則需要選中所有的用作尋路導航的靜態物體,在Navigation-->Object-->選中Generation OffMeahLinks,

然后在設置Bake中的Drop height的值即可。

 

三、使用Off-Mesh-Link組件:

通俗的說,就是一個用來進行隔空傳送的通道,當兩個尋航網格不在同一的平面上時,就可以使用這個來解決,可以方便的進行傳送。

 

1、創建以下場景:

                            

 

2、選擇其中的一個關鍵點,為其添加Off Meah Link組件,然后將兩個關鍵點賦值到相關的屬性中。

 

3、然后再進行Bake,這時就會在兩個關鍵點之間有一條線進行連接了。

 

4、為起始位置添加Run腳本,就是上篇的腳本,然后將重點位置進行真確的賦值。

 

5、運行游戲,則可以看到起始位置的球通過關鍵路徑移動到終點位置。

 

                            

四、為網格分層:

創建以下場景:

 

                           

 

為中間的兩個橋分別設置其的網格層為:Navigation-->Areas-->User 3 =Bridge1/Bridge2.

 

                            

然后進行Bake,則場景中的尋航導路的顯示如圖;

 

                    

 

接下來為其添加起始和開始位置的顯示,並按上面的步驟為起始主角添加Nav Mesh Agent和Run腳本,並進行相應的配置,重復的就不說了,這里的重點是:

 

                                

 

area Mask:這個選項用來控制那些尋路網格的使用,具體的效果可以修改這個Bridge1和Bridge2的選中狀態就可以看到效果了。

 

五、Navmesh Obstacle組件:

該組件比較適合處理動態路障的問題。

創建以下場景;

                      

 

場景中的兩個紅快分別是起始位置和終止位置,按照前面的步驟為橋面進行尋航網格的Bake,

同時為起始角色添加Run 腳本和Nav Mesh Agent,並完成相應的賦值。接下來為橋面附加Nav Mesh Obstacle組件,並未其附加Bridger腳本;

 

 1 using System.Collections;
 2 using System.Collections.Generic;
 3 using UnityEngine;
 4 
 5 public class Bridger : MonoBehaviour {
 6 
 7     void Start()
 8     {
 9         StartCoroutine(Init());
10     }
11     IEnumerator Init()
12     {
13        GetComponent<Renderer>().enabled = false;
14         yield return new WaitForSeconds(1f);
15         GetComponent<NavMeshObstacle>().enabled = false;
16         GetComponent<Renderer>().enabled = true;
17     }
18 }

 

此時預覽游戲,既可以發現,只有當中間的橋出來的時候,玩家角色才開始向終點位置移動。

六、參數解釋

1、Object(物體)參數面板:

                              

 

  • Navitation Static :旋中該復選框,則表示該游戲對象將參與導航網格的烘焙。
  • Generate OffMeshLinks:選中該復選框,可以自動根據Drop height和JumpDIstance的參數設置用關系線來連接分離的網格。
  • Navitation Area;導航區域設置

 

 

2、Bake(烘焙)面板;

                             

 

Agent Radius:具有代表性的物體半徑,其半徑越小,生成網格的面積越大,越精確。

Agent Height;具有代表性的物體高度

Max Slope:最大可行進的斜坡角度

Step height:可行走的台階高度

Drop Height:允許下落的最大下落距離

Advanced:高度參數調節;

  •  Manual Voxel Size:選中手動輸入像素值     
  • Voxel Size :輸入像素值            【注意;值越小,烘焙的越精確但是烘焙的時間會增多,要慎用】
  • Min Region Area :網格面積小於該面積的。將不生成尋航網格
  • Heiht Mesh:選中該參數,會保存高度信息,但是會損失性能,要慎用

3、Nav Mesh Agent(導航組件)面板;

                              

 

Agent SIze;尺寸控制

  •  Radius:物體的半徑
  • Height:物體的高度
  • Base Offset:偏移量

Steeing :行動控制

  • Speed:物體的行進最大速度
  • Angular Speed:行進過程中的轉向的角速度
  • Acceleration;物體的旋轉加速度
  • Stopping Distance:距離目標點小於多遠距離后邊停止行進
  • Auto Braking:選中后自動制動,類似於緩慢剎車的效果

Obstacle Avoidance:躲避障礙參數:

  • Quality:質量
  • Priority:優先級
  • Path Finding:路徑尋找

 

 

                                                                                                2017-12-19、01:34:44


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM