一、概述:
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