【Unity】12.1 基本概念

開發環境:Win十、Unity5.3.四、C#、VS2015 編輯器

建立日期:2016-05-09 性能

1、簡介

導航網格(Navmesh)是世界座標系中幾何體的簡化表示,被遊戲代理用來進行全局導航。一般,代理有一個目標或一個目的地,它試圖找到通往該目標或目的地的路徑,而後沿着該路徑導航到該目標,這個過程稱爲尋路(Path Finding)。 動畫

注意,導航網格生成(或烘培)一般由遊戲開發者在編輯器內完成,而尋路一般由代理在運行時根據該導航網格來完成。 3d

在複雜的遊戲世界中,能夠有許多代理和動態障礙物,因爲這些動態障礙物在世界幾何體的不一樣區域(Area)不斷變化,所以代理須要對這些變化做出動態反應。換言之,代理的尋路任務可能被一些事物打斷或受到其影響,例如避免與其餘角色發生碰撞、隨時有可能變化的地形特徵、物理障礙物的動態變化(好比關門)和實際目的地的更新等。 代理

2、導航尋路的基本過程

一、基本步驟 對象

如下步驟簡單介紹瞭如何設置導航網格以及代理如何在導航網格上尋路: blog

(1)在關卡中建立一些幾何體,例如平面 (Plane) 或地形 (Terrain),而後在檢視器窗口 (Inspector) 的右上角單擊靜態 (Static),對於Unity 5.x來講,當Static左側變爲「√」時,再單擊其右邊的下拉框,可看到默認狀況下,該幾何體的下列選項都被選中了: 遊戲

image

也能夠將其改成僅勾選導航靜態 (Navigation Static):內存

image

在上面的截圖中,Inspector右邊的【Navigation】標籤是經過【Window】->【Navigation Mesh】打開的導航網格窗口。在該標籤頁窗口中,能夠設置烘培參數,設置完成後單擊【烘焙(Bake)】按鈕,就會產生全部導航「靜態」幾何體的導航網格。 遊戲開發

(2)在場景中建立一些「動態」幾何體(好比角色),而後經過向場景中的動態幾何體添加 NavMeshAgent 組件,就能夠爲該幾何體建立一個代理(或多個代理)。

(3)在附加到代理的腳本中,爲代理提供一個目的地,這樣就能夠在Unity編輯器中經過爲腳本設置目的地屬性來指定導航目標。

(4)單擊【播放】按鈕,就能夠觀看動態幾何體自動導航尋路的動畫過程。

注意,還能夠自定義 NavMesh 層。如需讓代理更輕鬆地經過環境中的某些地方(相對於其餘地方),則可能須要這些層。

對於沒有直接鏈接的網格部分,能夠生成分離的網格連接(Off Mash Link Generation),即將這些不連續的網格一個接一個地連接起來,從而進一步實現尋路的功能。

二、烘培(Bake)及其屬性

對於標記爲靜態(static)的對象,經過【Window】->【Navigation Mesh】打開導航網格窗口後,即在【Navigation】視圖的【Bake】標籤頁中設置對其進行烘培的參數:

image

如下是影響導航網格 (Navmesh) 烘焙結果的屬性:

【Agent Radius】:「典型」代理的半徑(最好是最小值)。

【Agent Height】:「典型」代理的高度(角色經過所需的「空隙」)。

【Max Slope】:最大坡度。坡度大於此值的全部表面會予以丟棄。

【Step height】:臺階高度。當相鄰網格的高度之差低於臺階高度時,則認爲鏈接至導航網格區域。

【Drop height】:下落高度。若是該屬性值是正數,則將爲高度差小於該值的相鄰導航網格表面放置分離網格連接。

【Jump distance】:跳躍距離。若是該屬性值是正數,則將爲水平距離小於該值的相鄰導航網格表面放置分離網格連接。

【Min Region Area】:最小區域面積。面積小於該閾值的區域將予以丟棄。

【Height Mesh】:高度網格。若是勾選此選項,原始高度信息會存儲起來。這會對速度和內存性能形成必定影響。

注意,烘焙後的導航網格會變爲場景的一部分,代理就是經過它來導航的。要刪除導航網格,在烘焙 (Bake) 選項卡中單擊【Clear】按鈕便可。

三、細節解釋

烘焙導航網格 (Navmesh) 時,它會將Navmesh映射到 XZ 平面中的方格中。可視化方格時,其邊框被視爲導航網格 (Navmesh) 上的亮藍色軸對齊線。Unity 在一個場景中最多支持 1024 個方格,每一個方格用 1000x100 個像素表示。若是打算讓代理在大區域中導航,須要注意導航網格 (Navmesh) 的大小和最終的網格數。

image

代理半徑 (Agent Radius) 的默認設置爲 0.5,寬度偏差 (Width Inaccuracy) 的默認設置爲0.16666667 (16.666667%)。默認設置的方格邊長可計算爲:

1000 * (2*半徑) * 寬度偏差 = 1000 * (2*0.5) * 0.16666667 = 166.66667。

增長寬度偏差 (Width Inaccuracy) 將容許容納更大的面積,但這樣作會下降導航網格 (Navmesh) 的精度。

例如,若是網格有 32 x 32 個方格,則將擁有 1024 個方格。這意味着,若是擁有想與導航網格 (Navmesh) 配合使用的真正巨大地形,按照默認設置,該地形面積不得超過 5.333 乘以 5.333 公里(32 * 166.66667 米)。

相關文章
相關標籤/搜索