Importing A Unity Navmesh
將導航網格帶到Quantum的最常見的方式是匯入Unity導航網格,並且將其嵌入一個Quantum二進位導航網格。
匯入一個Unity導航網格
- 設定您的Unity場景,其使用全域導航網格嵌入器或導航網格組建元件(導航網格表面)來生成一個Unity導航網格
- 在地圖(Quantum
MapData
指令碼)下建立一個新的遊戲物件,並且新增一個MapNavMeshUnity
指令碼給它。遊戲物件的名稱之後將成為Quantum導航網格的名稱。 - 選取地圖並且切換
Bake All Mode
到Everything
,並且按下嵌入所有,並且檢查記錄中是否有錯誤。我們所期待的記錄訊息類似於:Imported Unity NavMesh 'Navmesh', cleaned up 1211 vertices, found 7 region(s), found 4 link(s)
- Quantum導航網格將出現在...
- ...Quantum地圖資產
NavMeshLinks
之下 - ...在您的專案檢視中,地圖資產檔案(一個Quantum資產檔案及一個二進位
.bytes
檔案)的旁邊
- ...Quantum地圖資產
- 為了視覺化已嵌入的Quantum導航網格,新增
MapNavMeshDebugDrawer
到導航網格遊戲物件,並且在BinaryAsset
下連接.bytes
檔案。 - 為了在遊玩模式視覺化導航網格,在
QuantumEditorSettings
中選取Draw Nav Mesh
所有地圖之下的MapNavMeshUnity
指令碼將在地圖嵌入時被評估。但因為全域Unity導航網格嵌入只產生一個導航網格,因此只有新增多個導航網格到地圖才合理:
- 當您正在使用表面附加元件以控制多個導航網格表面
- 當您正在手動繪製導航網格:使用
MapNavMeshDefinition
而非MapNavMeshUnity
(請見Quantum V1文檔) - 或是當您正在建立您的自訂嵌入邏輯,其在多個Unity導航網格嵌入迭代時,啟用及停用地圖的一部分
選擇性地,可以在每次場景儲存、遊玩模式更改或組建事件時,自動強制運行導航網格嵌入。請見在QuantumEditorSettings
中的編輯器功能。
Quantum只支援位於原點的導航網格。我們鼓勵遊戲在靠近原點的地方進行,並且合理的延伸,這是基於固定點運算精確性的原因。
匯入設定
焊接相同的頂點 | Unity導航網格是非連接三角形的集合。這個選項非常重要,並且結合了共享的頂點。 |
焊接頂點Epsilon值 | 請不要讓Epsilon值太小,可能錯過需要焊接的頂點,同時請不要讓Epsilon值太大,因為其將使您的導航網格變形。 |
Delaunay三角法 | 這個選項將使用Delaunay三角法,對已匯入的Unity導航網格進行後期處理,以產生更均勻分佈的三角形(其重新排序了長三角形)。 |
Delaunay三角法在平面上的限制 | 在3D導航網格上,Delaunay三角法可能在重新排列三角形時,使斜坡上的導航網格變形。這個行為在Unity導航網格上也相當明顯,並且當遊戲遊玩使用導航網格高度時,可能影響遊戲(例如,走在導航網格上)。 選取這個選項,可限制三角法用於同一平面上的三角形。 |
在邊緣上固定三角形 | 已匯入的頂點有時候位於其他三角形的邊上,這導致不需要的邊界偵測。有了這個選項,這些三角形將被分開。 |
最近三角形計算 | 在地圖格線中沒有導航網格的區域,將需要偵測最接近芳鄰。這個計算非常緩慢。螺旋轉出選項將快得多,但是遞補三角形可能為空值。 |
最近三角形計算深度 | 使用螺旋轉出時,在各個方向上搜尋三角形的單元數量。 |
啟用Quantum_XY | 只在設定QUANTUM_XY定義後可見。切換這個為開,之後導航網格嵌入將翻轉Y軸及Z軸,以支援在XY平面中生成的導航網格。 |
最小代理半徑 | 導航網格支援的最小代理半徑。這個值是導航網格及可見邊界之間的邊距。在編輯器中嵌入時,透過從Unity導航網格嵌入設定(或表面設定)擷取該值,該值將被覆蓋。 |
使用導航網格表面
使用Unity導航網格表面附加元件有以下好處:
- 可以進行運行階段導航網格計算(請注意,這無法在客戶端之間確定性的完成,必須向各處發送已生成的導航網格二進位資料)
- 建立多個導航網格非常容易
- 使用
NavMeshModifier
指令碼,有助於避免Unity導航網格島嶼問題(請見Quantum問與答) - 對於內部設定有更多控制
您可以連接多個表面到一個Quantum導航網格,做法是將它們新增到NavMeshSurfaces
清單。在一個導航網格的地圖嵌入時,將暫時停用在場景中的其他表面。
自訂嵌入選項
MapNavMeshBaker.BakeNavMesh()
是基礎Quantum導航網格嵌入方法,並且其使用MapNavMesh.BakeData
作為輸入資料。在預設設定中,從已匯入的Unity導航網格三角法來生成嵌入資料。在一個自訂設定中,您可以自行填入該資料架構。它基本上只是一個三角形的亂序集合。
您可以透過不同方式自訂導航網格嵌入。
- 透過從
MapDataBakerCallback
衍生,新增靜態程式碼到嵌入管線:- 執行
OnCollectNavMeshBakeData
以修改現有的或插入新的MapNavMesh.BakeData
到管線之中。 - 執行
OnCollectNavMeshes
以修改現有的或新增新的需要序列化的NavMesh
物件。 - 執行
OnBeforeBakeNavMesh
或OnBakeNavMesh
以完全地自訂嵌入或執行前期或後期處理。
- 執行
C#
public abstract class MapDataBakerCallback {
/// <summary>
/// Is called before any navmeshes are generated or any bake data is collected.
/// </summary>
public virtual void OnBeforeBakeNavMesh(MapData data) { }
/// <summary>
/// Is called during navmesh baking with the current list of bake data retreived from Unity navmeshes flagged for Quantum navmesh baking.
/// Add new BakeData objects to the navMeshBakeData list.
/// </summary>
/// <param name="navMeshBakeData">Current list of bake data to be baked</param>
public virtual void OnCollectNavMeshBakeData(MapData data, List<MapNavMesh.BakeData> navMeshBakeData) { }
/// <summary>
/// Is called after navmesh baking before serializing them to assets.
/// Add new NavMesh objects the navmeshes list.
/// </summary>
/// <param name="navmeshes">Current list of baked navmeshes to be saved to assets.</param>
public virtual void OnCollectNavMeshes(MapData data, List<Quantum.NavMesh> navmeshes) { }
/// <summary>
/// Is called after the navmesh generation has been completed.
/// Navmeshes assets references are stored in data.Asset.Settings.NavMeshLinks.
/// </summary>
public virtual void OnBakeNavMesh(MapData data) { }
}
在地圖嵌入流程中進行反射,來調用在MapDataBakerCallback
中的方法。只需填入任何組件定義之外的公共類別中的方法。無需具現化一個遊戲物件。如需取得更多關於地圖資產嵌入管道的資訊,請參照操作手冊中的 資產 頁面。
視覺化路徑尋找
啟用在QuantumEditorSettings
上的路徑尋找Gizmo Draw Pathfinder Funnel
,以在場景檢視中看見路徑Gizmo
在SimulationConfig
中將Thread Count
設定為1,以讓Gizmo每次都工作,因為從Unity而來的話,我們只能存取主要執行緒。