1. 程式人生 > >unity導航系統

unity導航系統

                                                                導航系統

Unity 中有一個專門用於實現導航尋路功能的 Navigation 系統。
這個系統由三個元件和一個 Navigation 總控制面板組成。

一.導航系統介紹
1.現實生活中的導航系統
遊戲是什麼?遊戲是創造一個虛擬的世界,在這個虛擬的世界,所有的東西,我
們在現實生活中都能找到它們的影子,比如導航系統。
智慧手機上的百度地圖,高德地圖,本身就是一個導航系統。
導航的本質:
導航系統能幫助我們從 A 點(出發點)到達 B 點(目的地)。
從 A 點到 B 點可能有 N 條路,導航系統會幫我們選出最快捷最方便的那條路。
現實生活中的導航系統是這樣的,虛擬世界中的導航系統同樣也是這樣的。

2.Unity 中的導航系統
Unity 中的導航系統是由“A*演算法”延伸擴充套件實現的。
由三個導航元件,一個控制面板組成。通過導航系統,我們可以實現類似於現實
生活中的導航。

二.導航系統步驟

1.準備測試場景
①.建立地面,角色,目的地位置,搭建一個簡單的場景。

②.調整以上三者的位置資訊【見圖】。


2.烘焙導航場景
地面上哪些位置角色是可以行走的,我們是需要標示處理的,如何處理那?
①.將地面勾選 static,變成靜態物體(場景中只有靜態物體才能參與烘培)


②.在unity導航欄點選Window-->Navigation-->Bake-->Bake,烘焙導航場景。
也就是說“標示出角色可以移動行走的範圍”,烘焙完畢後,會出現一個和場景
同名的資料夾,儲存導航網格烘焙的資料。


3.導航尋路元件


我們的角色要在烘焙過的範圍內實現導航,角色身上需要新增一個導航元件(NavMeshAgent(導航網格代理器))。

由該元件負責實現導航功能

①.選中角色在unity導航欄點選Component-->Navigation-->Nav Mesh Agent新增該元件。

 
②建立指令碼命名為Player控制該元件移動到導航目的地。

 

三:NavMeshAgent 元件引數分析

1.Steering[操作]
Speed[速度]:導航的移動速度;
Angular Speed[轉彎速度]:模型是Z軸朝向目標點;如果不是,則轉向;
Acceleration[加速度]:保持預設即可;
Stopping Distance[停止距離]:距離目的地多遠的時候停止;
Auto Braking[自動停止]:保持預設勾選狀態即可(備註:我這邊的unity版本是2017.2,經過測試發現勾選和未勾選沒有區別);

2.Obstacle Avoidance[障礙迴避]

Radius[半徑]:控制代理器這個“圓柱體”的半徑,也就是大小;
Height[高度]:控制代理器這個“圓柱體”的高度;

Qualty[質量]:避障質量。如果您擁有大量代理,則可以通過降低避障質量來節省CPU時間。將避免設定為無,只會解決衝突,但不會嘗試主動避免其他代理和障礙。(備註:這是官方的解釋,本人也為做過測試)

priority[優先順序]:執行避免時,此代理將忽略優先順序較低的代理。該值應在0-99範圍內,其中較低的數字表示較高的優先順序。

如何區分哪個是導航代理器那?[見圖]

Base Offset[基礎偏移]:控制代理器這個“圓柱體”在垂直方向的偏移量;

四:Navigation面板之Bake引數

1.Baked Agent Size[烘焙代理器大小]
①Agent Radius[代理器半徑]
場景中有靜態障礙物的時候,烘焙出來的網格和障礙物之間有一定的“留白”。
這個留白的目的是避免角色導航的時候與障礙物相撞,避免產生“穿幫”。
代理器是一個“圓柱體”形狀,且在導航的時候是以圓柱體的中心點為移動點的。
所以說這裡的 Agent Radius 其實是設定“留白”的寬度;值越大,留白的寬
度也就越大,反之亦然。
這個引數是要配合場景中角色的具體尺寸來進行調整烘焙的。

測試準備:

1.建立一個Cube模型。

2.調整位置和縮放。

3.勾選靜態選項。

4.將Agent Radius的引數調整為0.7。

5.點選Navigation面板的Bake按鈕。

6.執行測試後在將Agent Radius的引數調整為0.5,然後在次執行測試,觀察效果和差距。

 ②.Agent Height[代理器的高度]
當場景中的導航出現上下層的時候,比如樓房的多個樓層的地面。
當樓層與樓層之間的距離比 Agent Height 的高度還要小的時候,這個區間內
就不會生成導航網格。
這個引數也是要配合場景中角色的具體尺寸來進行調整烘焙的。

測試準備:

1.建立一個Cube模型

2.調整位置和縮放

3.勾選靜態選項

4.將Agent Height選項的引數值調整為1

5.點選Navigation面板的Bake按鈕

6.執行測試後在將Agent Height的引數調整為2,然後在次執行測試,觀察效果和差距。

③.Max Slope[最大爬坡能力] 

當場景中的導航地面有斜坡的時候,控制低於多少度的斜坡可以導航攀爬。

測試準備:

1.建立Cube模型

2.調整位置和縮放

3.勾選靜態選項

4.將Max Slopet選項的引數值調整為40

5.點選Navigation面板的Bake按鈕

6.調整終點的位置

7.執行測試後在將Max Slope的引數調整為45,然後在次執行測試,觀察效果和差距。

④.Step Height[臺階高度]
當場景中出現臺階的時候,控制多高的臺階角色可以導航。
但是這個臺階的高度不能高於 Agent Height 的高度。

這一步大家有興趣可以自己搭建臺階配合引數調整觀察效果,步驟同上!
備註說明:
這四個引數都是要配合場景的具體環境來進行設定的。
而且這四個引數是與 NavMeshAgent 元件相關的。

Object面板引數介紹

選中任意一個勾選了靜態選項的模型【見圖】

Navigation Static:當前模型是否參與了“導航系統”;
Generate OffMeshLinks:生成“網格跳躍線”(關於這個選項請繼續往下觀看)
Navigation Area:導航區域,代表當前有哪些區域是可以行走的,是一個列舉。

 五:Navigation面板之Areas選項引數

①.Areas 簡介
在現實生活中,是有不同的“地形路況”的。
比如:草地,沙漠,沼澤,湖泊,河流等等,我們人在這些不同的地形上行走,
感覺是不一樣的,對於人來說,有“這個路好走”和“這個路不好走”之分。
A 點到 B 點有兩條路,一條是公路,一條是沙漠,100%的人都會選擇走公路,
因為這個公路好走,並且公路比沙漠更安全。
在Unity裡面我們可以通過Navigation面板中的Areas功能來定義不同的地
形路況。

②.Unity 內建地形路況
Unity 內建(Built-in)了三種地形:可行走,不可行走,跳躍。
我們建立的所有參與導航系統烘焙的模型,預設都是“可行走路況”。

③.Unity 使用者地形路況
Unity 除去內建的三種地形外,還允許使用者根據自己的實際開發要求來自定義最
多 29 種不同的地形路況,分別是 User3~User31。

測試準備:

1.調整地面的縮放X軸為1.1,按住Ctrl+D複製出來一份,調整Z軸位置為16

2.按住Ctrl+D複製出來三份分別命名為Grass(草地)、River(河流)、以及Desert(沙漠)

3.調整位置【見圖】

4.移動終點的位置【見圖】

5.切換到Navigation面板選擇Areas選項 ,填寫對應的名字【見圖】

6.選擇Object選項分別為Grass、River、Desert設定導航區域【見圖】 

根據以上步驟更改其它倆個! 

7.最後點選Bake按鈕烘培導航網格

8.執行測試,測試後你會發現角色會選擇River(河流)這條路徑行走,那是因為河流這條路距離終點是最近的,但是在現實生活中,我們往往會選擇草地這條路徑去行走,那麼如何讓角色沿著草地這條路徑去行走吶?(繼續往下看)

②.Cost 代價
代價,在這條路上行走需要消化的“代價”,這裡的代價可以是體力,可以是金
幣,同樣的道路長度,代價越高,被選中的可能性越低。

修改Navigation面板Areas選項卡Cost的值,然後執行測試。【見圖】

 

 六:OffMeshLink  元件基本使用

①.OffMeshLink 元件介紹
Off Mesh Link:分離網格跳躍線。
當我們場景中存在兩塊獨立的烘焙導航區域的時候,之間有很大的間距,角色要
想在兩塊區域之間繼續導航的話,就需要“一座橋樑”來連線兩塊區域。
而 Off Mesh Link 元件,就是這座橋樑。

測試準備:

1.建立一個Cube模型,調整位置和縮放【見圖】

2.調整終點的位置【見圖】 

3.建立開始點和結束點並調整位置和縮放【見圖】 

4.往開始點或者結束點任意一個物體身上新增 OffMeshLink 元件並設定起點和終點【見圖】

5.執行測試,檢視效果。

②.OffMeshLink 面板屬性 

1.Start 和 End
用於設定“跳躍線”的開始點和結束點,兩點成線。

2.Cost Override [代價覆蓋]
定義角色通過這個“跳躍線”所要付出的代價是多少。
預設值是-1,代表角色通過該跳躍線不需要代價。
注意:這裡的代價覆蓋的是“Navigation Area”引數指定的地形代價。


3.Bi Directional [雙向跳躍線]
該屬性是一個複選框,如果勾選,則角色可以在兩點之間來回的跳躍移動;
如果不勾選,則只是單行道,只能從開始點跳躍到結束點。

4.Activated [啟用狀態]
用於設定該跳躍線是否啟用,是否可用。
啟用狀態:跳躍線為深藍色;未啟用狀態:跳躍線為暗紅色。

5.Auto Update Positions[自動更新位置]
如果勾選該引數,則表示自動更新位置,我們在執行狀態的時候,是可以動態的
改變開始點或者結束點的位置的,同時跳躍線也會動態的更新,反之亦然。

③.OffMeshLink 注意事項
1.開始點和結束點可以是模型,也可以是空物體,只需要具備 Transform 元件
即可;
2.開始點和結束點不需要靜態,因為這個“跳躍線”不需要參與 Navigation
面板上的網格烘焙;
3.開始點和結束點不能距離烘焙出來的導航網格太遠;
開始點和結束點的位置是有兩個圓圈的,如果沒有圓圈說明這個位置點距離烘焙
出來的導航網格太遠,需要手動調進它們之間的距離。

七:NavMeshObstacle元件基本使用

①.NavMeshObstacle 元件介紹
Nav Mesh Obstacle:導航網格障礙物。
在角色的導航範圍內,如果說需要出現障礙物,我們一般是將這些障礙物設定為
靜態,一起參與 Navigation 的導航烘焙;這樣的話,我們的角色在導航的時
候,就不會與這些障礙物模型相碰撞。
但是如果說我們需要一些“動態的導航障礙物”,這些障礙物模型不設定靜態,
不參與烘焙,甚至是通過程式碼例項化出來的模型動態的新增到我們的導航地形
中,我們就需要用到一個新的元件了,這個元件就是 Nav Mesh Obstalce。

②.NavMeshObstacle 面板屬性
1.Shape[形狀]
控制障礙物的形狀,正方體或者膠囊體。
注意:這個障礙物可以是一個空物體,我們就是通過這個 Shape 屬性來控制這
個障礙物的範圍。


2.Carve[雕刻]
只有勾選了該屬性,這個障礙物才會生效。
勾選上該屬性後,會出現如下三個可以控制的引數:


Move Threshold:[移動閾值]
大於該值的移動,才認為是真正發生了移動。


Time To Stationary:[時間靜止]
每間隔多長時間,檢查一次該障礙物的位置,如果發生了移動則動態的更新導航
網格的資料。


Carve Only Stationary:[僅雕刻靜止物體]
勾選後,則按上面的時間間隔,固定的檢查位置,固定時長更新網格資料;
如果不勾選,則是每幀都會檢查位置,如果發生位移,立刻更新網格資料。

測試準備:

1.建立一個Cube模型並調整位置和縮放,往模型身上新增一個NavMeshObstacle元件 【見圖】

2.執行測試,觀看效果 

 

八:OffMeshLinks自動生成

①.OffMeshLinks 簡介
在之前,我們講解過 Off Mesh Link 這個元件,指定兩個位置點,就
可以在兩點之間生成“跳躍線”。
那麼 Off Mesh Links 是什麼那??
Off Mesh Links 不是一個元件,它是 Navigation 面板上的導航烘焙引數,
但是基本功能和 Off Mesh Link 是完全一樣的,不同點是 Off Mesh Link 是
需要我們手動一個一個的設定,而 Off Mesh Links 則可以批量生成。

 

②.OffMeshLinks 使用
1.基礎說明
在 Navigation 面板的 Bake 選項中有一個“Generated Off Mesh Links”
這麼一組設定選項,我們就是通過這個區域的來控制如何自動生成跳躍線。
2.Drop Height [落差]
在多高的落差之間生成跳躍線。落差:指的是垂直方向。
預設值為 0,表示該選項無效;
設定成其他的數字,比如 2,則會在落差 2 以內的區域內自動生成跳躍線。
注意:這時生成的跳躍線是單向的,高處往低處跳躍。
3.Jump Distance [跳躍距離]
在多遠的距離之間生成跳躍線。距離:指的是水平方向。
預設值為 0,表示該選項無效;
設定成其他的數字,比如 2,則會在距離 2 以內的區域內自動生成跳躍線。
注意:這時生成的跳躍線也是單向的,但是,距離方向的跳躍線往往是成組生成,
所以還是可以雙向移動的。

這個屬性的設定各位可以自行測試。

此文章只是為了記錄一下學習筆記,如有不足還望多多指點!