This document is about: QUANTUM 3
SWITCH TO

Unityナビメッシュのインポート

Quantumナビメッシュ生成は、Unityナビメッシュのパイプライン上に構築されていて、Unityナビメッシュ三角形分割をインポートして、Quantumナビメッシュバイナリ形式にベイクします。

原点位置のナビメッシュのみがサポートされ、ベイク処理ではワールド座標がQuantumナビメッシュに書き込まれます。Quantum物理エンジンと同様に、固定小数点精度の問題を回避するため、原点付近でゲームプレイを行うことが推奨されます。

Unityナビメッシュのインポート

  • Unity Package Manager > Unity Registryから、UnityプロジェクトにAI Navigationパッケージcom.unity.ai.navigationを追加してください。

    AI Navigation package
  • UnityのNavMesh Surfaceを作成・セットアップします。

    Create a surface
  • QuantumMapData配下に新しいゲームオブジェクトを作成し、QuantumMapNavMeshUnityスクリプトを追加します。

    Create script
  • NavMesh SurfaceゲームオブジェクトをNav Mesh Surfacesリストに追加します。

    Add a Surface
  • マップオブジェクトを選択し、Bake All ModeオプションからEverythingを有効にします。Bake Allを押すと、ナビメッシュインポートのメッセージがコンソールに表示されます。

    Imported Unity NavMesh 'Navmesh', cleaned up 7 vertices, found 1 region(s), found 0 link(s)
    
  • Quantumナビメッシュは、2つのアセットファイルにベイクされます。ナビメッシュアセットとバイナリデータアセット(_data接尾辞)は、マップアセットと同じ場所に置かれます。

    Navmesh assets
  • ベイク完了後、QuantumMapDataスクリプトのNav Mesh Linksから、ナビメッシュアセットを参照します。

    Map navmesh references
  • マップオブジェクトを選択すると、Quantumナビメッシュのギズモが表示されます。ギズモ描画を切り替えるには、Quantum Gizmosオーバーレイメニューを開いてください。(Sceneタブを右クリック > Overlay Menu > Quantum Gizmos)

    Show Quantum navmesh gizmos
  • QuantumEditorSettingsから任意で、自動ビルドモードによるナビメッシュ構築に切り替えることもできます。

    Auto build modes
  • ゲーム起動時には、RuntimeConfigに設定されているSystemsConfigQuantum.Core.NavigationSystemを追加してください。デフォルトでは、このシステムは正しく追加されて有効化されています。

    Auto build modes

インポート設定

UnityナビメッシュからQuantumナビメッシュへの変換では、QuantumMapNavMeshUnityスクリプトを使用してインポート設定をカスタマイズ可能です。

WeldIdenticalVertices Unityナビメッシュは、接続されていない三角形の集合です。このオプションは非常に重要で、共有されている頂点を結合します。
WeldVertexEpsilon このイプシロン値を小さくしすぎると、結合すべき頂点が見落とされる可能性があります。また、大きくしすぎると、ナビメッシュが変形します。
DelaunayTriangulation インポートされたUnityナビメッシュを後処理するオプションです。ドロネー三角形分割によって、より均等分布した三角形(長い三角形の再配置)を生成します。
DelaunayTriangulationRestrictToPlanes 3Dナビメッシュでは、ドロネー三角形分割で三角形を再配置する際に、斜面のナビメッシュを変形させる可能性があります。この挙動はUnityナビメッシュでも顕著に表れ、ナビメッシュの高さがゲームプレイに使用される(例:ナビメッシュ上を歩く)際にゲームに影響を与える可能性があります。このオプションを有効にすると、三角形分割が同一平面上の三角形に制限されます。
FixTrianglesOnEdges インポートされた頂点が他の三角形の辺上にあった場合、不要な境界検出が発生します。このオプションを有効にすると、該当の三角形が分割されます。
FixTrianglesOnEdgesEpsilon 大規模なナビメッシュで誤った境界検出が発生した際は、この値を増やす(例:0.001)必要がある場合があります。最小値はfloat.Epsilonです。
FixTrianglesOnEdgesHeightEpsilon FixTrianglesOnEdgesEpsilonより大きい高さオフセットを設定することで、縮退三角形を正確に検出します。ナビメッシュが変形する場合は、値を小さくしてください。最小値はfloat.Epsilonで、デフォルトは0.05です。
LinkErrorCorrection この距離を検索して、ナビメッシュリンク位置を最も近い三角形に自動補正します。(デフォルトは0)
ClosestTriangleCalculation ナビメッシュが存在しないマップグリッドエリアでは、最近傍三角形を検出する必要があります。この計算は非常に遅く、SpiralOutオプションは高速ですが三角形フォールバックがnullになる可能性があります。
ClosestTriangleCalculation Depth SpiralOut使用時、各方向に対して三角形を検索するセル数です。
EnableQuantum_XY QUANTUM_XY定義が設定されている場合のみ表示されます。これを有効にすると、ナビメッシュベイク時にYとZを入れ替え、XY平面でナビメッシュを生成します。
MinAgentRadius ナビメッシュがサポートする最小のエージェント半径です。この値は、ナビメッシュとビジュアル境界との間のマージンです。エディターからベイクする際、Unityナビメッシュベイク設定(またはSurface設定)から取得した値で上書きされます。
ImportRegionMode リージョンモードを変更/無効化します。詳細は「ナビメッシュリージョンの使用」セクションをご覧ください。デフォルトはSimpleです。
RegionDetectionMargin ナビメッシュの三角形分割はソースサイズとは完全に一致しないため、人工的なマージンが必要です。この値はナビメッシュエリアに追加され、正しいリージョンIDを選択するためにすべてのQuantumリージョンスクリプトでチェックされます。
RegionAreaIds Quantumリージョンに変換されるUnityエリアIDです。エリア名(Simple)を使用するか、明示的なリージョン名(Advanced)を使用します。

マップ上のナビメッシュ設定

QuantumMapDataスクリプトには、ナビメッシュ関連の設定が2つ(SerializeTypeと、ナビメッシュのGridSize/WorldSize)あります。どちらの設定も、ベイク処理中にナビメッシュアセットに適用/コピーされます。

この設定は、ナビメッシュアセットのどれをシリアライズするか?どれをロード時に生成するか?を制御します。これによってアセットサイズを削減し、実行時にアセットを作成してクライアントへ送信する際に便利です。(詳細はカスタムナビメッシュ生成をご覧ください)

Navmesh Area Gizmos
Full 完全なデータをシリアライズしますが、メタデータはロード後に計算します。

デフォルト値です。
サイズ中
FullWithMetaData 完全なデータとメタデータ(例:法線)をシリアライズします。 サイズ大
BakeDataOnly NavMeshBakeDataのみをシリアライスし、実行時にナビメッシュをベイクします。 サイズ最小

NavMesh AreaNavMesh Gridのギズモは、Quantum Navmeshオーバーレイメニューから有効にすると、シーンにレンダリングされます。

Navmesh Area Gizmos

グリッドは、QuantumMapDataスクリプトのNavMesh Settingsから設定できます。全体のグリッドサイズは、X/Y/Z方向のセル数と、ノードサイズ(Unity単位でのセル寸法)によって決まります。

Navmesh Area Map Data

ナビメッシュグリッドエリアは、ナビメッシュ全体(左側のスクリーンショットの青枠)を包含する必要があります。

グリッドセル(右側のスクリーンショットの黄枠)は、含まれるナビメッシュ三角形が多すぎないような適切なサイズにする必要があります。ナビメッシュデータサイズとパフォーマンスはトレードオフです。セルが小さいほどデータ構造は大きくなりますが、経路探索時に調べる三角形が少なくなります。

Navmesh Area
Navmesh Area Grid

ナビメッシュのワールド座標が原点付近にない場合でも、グリッドエリア内に収める必要があります。

カスタムナビメッシュベイクコールバック

ナビメッシュベイクプロセスは、MapDataBakerCallbackクラスのコールバックによって拡張できます。

以下のスクリプトをQuantumUser/Editorに追加してください。

ベイクプロセスがコールバックを見つけるためにQuantumMapBakeAssembly属性が必須です。

C#

[assembly: Quantum.QuantumMapBakeAssembly]

namespace Quantum.Editor
{
  using System.Collections.Generic;
  using UnityEngine;

  public class NavmeshBakeCallback : MapDataBakerCallback
  {
    public override void OnBeforeBakeNavMesh(QuantumMapData data)
    {
      // ナビメッシュベイクが行われる前
    }

    public override void OnCollectNavMeshBakeData(QuantumMapData data, List<NavMeshBakeData> navMeshBakeData)
    {
      // Unityナビメッシュがインポートされ、ベイクデータが設定された後
      Debug.Log($"Found {navMeshBakeData.Count} navmesh bake data");
    }


    public override void OnCollectNavMeshes(QuantumMapData data, List<NavMesh> navmeshes)
    {
      // Quantumナビメッシュベイク時
    }

    public override void OnBakeNavMesh(QuantumMapData data) { 
      // Quantumナビメッシュがアセットに保存された時
    }

    // 抽象メソッドの実装が必要だが、ここでは必要ない
    public override void OnBake(QuantumMapData data) { }
    public override void OnBeforeBake(QuantumMapData data) { }
  }
}
Back to top