This document is about: QUANTUM 2
SWITCH TO

Importing A Unity Navmesh

將導航網格帶到Quantum的最常見的方式是匯入Unity導航網格,並且將其嵌入一個Quantum二進位導航網格。

匯入一個Unity導航網格

  • 設定您的Unity場景,其使用全域導航網格嵌入器導航網格組建元件(導航網格表面)來生成一個Unity導航網格
  • 在地圖(Quantum MapData指令碼)下建立一個新的遊戲物件,並且新增一個MapNavMeshUnity指令碼給它。遊戲物件的名稱之後將成為Quantum導航網格的名稱。
    Create Navmesh Script
    新增地圖導航網格Unity指令碼,以匯入一個Unity導航網格
  • 選取地圖並且切換Bake All ModeEverything,並且按下嵌入所有,並且檢查記錄中是否有錯誤。我們所期待的記錄訊息類似於:
    Imported Unity NavMesh 'Navmesh', cleaned up 1211 vertices, found 7 region(s), found 4 link(s)
    
    Map Baking
    嵌入地圖將匯入及嵌入導航網格
  • Quantum導航網格將出現在...
    • ...Quantum地圖資產NavMeshLinks之下
    • ...在您的專案檢視中,地圖資產檔案(一個Quantum資產檔案及一個二進位.bytes檔案)的旁邊
    Navmesh Project View
    Quantum導航網格檔案將出現在專案檢視中
  • 為了視覺化已嵌入的Quantum導航網格,新增MapNavMeshDebugDrawer到導航網格遊戲物件,並且在BinaryAsset下連接.bytes檔案。
    Navmesh Gizmos
    導航網格Gizmos使用地圖導航網格偵錯選單指令碼,被轉譯成非運行場景
  • 為了在遊玩模式視覺化導航網格,在QuantumEditorSettings中選取Draw Nav Mesh

所有地圖之下的MapNavMeshUnity指令碼將在地圖嵌入時被評估。但因為全域Unity導航網格嵌入只產生一個導航網格,因此只有新增多個導航網格到地圖才合理:

  • 當您正在使用表面附加元件以控制多個導航網格表面
  • 當您正在手動繪製導航網格:使用MapNavMeshDefinition而非MapNavMeshUnity(請見Quantum V1文檔)
  • 或是當您正在建立您的自訂嵌入邏輯,其在多個Unity導航網格嵌入迭代時,啟用及停用地圖的一部分

選擇性地,可以在每次場景儲存、遊玩模式更改或組建事件時,自動強制運行導航網格嵌入。請見在QuantumEditorSettings中的編輯器功能。

Navmesh Auto Baking

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清單。在一個導航網格的地圖嵌入時,將暫時停用在場景中的其他表面。

Navmesh Surfaces
Quantum支援Unity導航網格表面附加元件

自訂嵌入選項

MapNavMeshBaker.BakeNavMesh()是基礎Quantum導航網格嵌入方法,並且其使用MapNavMesh.BakeData作為輸入資料。在預設設定中,從已匯入的Unity導航網格三角法來生成嵌入資料。在一個自訂設定中,您可以自行填入該資料架構。它基本上只是一個三角形的亂序集合。

您可以透過不同方式自訂導航網格嵌入。

  • 透過從MapDataBakerCallback衍生,新增靜態程式碼到嵌入管線:
    • 執行OnCollectNavMeshBakeData以修改現有的或插入新的MapNavMesh.BakeData到管線之中。
    • 執行OnCollectNavMeshes以修改現有的或新增新的需要序列化的NavMesh物件。
    • 執行OnBeforeBakeNavMeshOnBakeNavMesh以完全地自訂嵌入或執行前期或後期處理。

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而來的話,我們只能存取主要執行緒。

Back to top