Unity Navmeshのインポート
NavmeshをQuantumに取り込む最も一般的な方法は、Unity navmeshをインポートして、Quantumバイナリnavmeshにベイクすることです。
Unity Navmeshのインポート
- Unityシーンをセットアップし、global Navmesh BakerまたはNavmesh Building Components (Navmesh Surfaces)を使用してUnity Navmeshを生成します。
- マップの下に新しいGameObject(Quantum
MapDataスクリプト)を作成し、それにMapNavMeshUnityスクリプトを追加します。 GameObjectの名前は、後にQuantum navmeshの名前になります。
Unity navmeshをインポートするためにMapNavMeshUnityスクリプトの追加 - マップを選択し、
Bake All ModeをEverythingに切り替え、Bake All を押してログにエラーがないか確認します。 次のようなログメッセージが表示されます。Imported Unity NavMesh 'Navmesh', cleaned up 1211 vertices, found 7 region(s), found 4 link(s)
マップをベイクすると、navmeshesがインポートされ、ベイクします。 - Quantum navmeshが表示されます。
- ..Quantumマップアセット
NavMeshLinksの下 - ..プロジェクトビュー内のマップアセットファイルの横(1つのQuantumアセットファイルと1つのバイナリ
.bytesファイル)
Quantum navmeshファイルがプロジェクトビューに表示されます。 - ..Quantumマップアセット
- ベイク処理されたQuantum navmeshを視覚化するには、
MapNavMeshDebugDrawerをnavmesh GameObjectに追加して、.bytesファイルをBinaryAssetの下にリンクします。
Navmeshギズモは、MapNavMeshDebugDrawerスクリプトを使用して非実行シーンにレンダリングされます - プレイモード中にnavmeshを視覚化するには、
QuantumEditorSettingsでDraw Nav Meshを選択します。
マップの下のすべての MapNavMeshUnityスクリプトは、マップのベイク中に評価されます。ただし、グローバルUnity navmeshベイク処理では1つのnavmeshしか生成されないため、マップに複数のnavmeshを追加するのべきなのは以下の場合のみです。
- サーフェスアドオンを使用して複数のnavmeshサーフェスを制御する場合
- navmeshを手動で描画する場合:
MapNavMeshUnityの代わりにMapNavMeshDefinitionを使用する場合(Quantum V1のドキュメント参照) - 複数のUnity navmeshベイク処理中にマップの一部を有効または無効にするカスタムベイクロジックを作成している場合
オプションで、navmeshベイク処理は、すべてのシーンの保存、プレイモードの変更、またはビルドイベントで自動的に実行するように強制できます。 「QuantumEditorSettings」のエディター機能を参照してください。
Quantumは、原点にのみ配置されているnavmeshesに対応しています。 固定小数点演算の精度が高いため、ゲームプレイは原点付近で適切な範囲で行うことをお勧めします。
インポート設定
| Weld Identical Vertices | Unity NavMeshは、接続されていない三角形を集めたものです。 このオプションは非常に重要であり、共有する頂点を組み合わせます。 |
| Weld Vertex Epsilon | イプシロンを小さくしすぎないでください。融合に必要な頂点が失われる可能性があります。また、値を大きくしすぎるとnavmeshが変形してしまいます。 |
| Delaunay Triangulation | インポートされたUnity navmeshをDelaunay三角形分割で後処理して、より均等に分散された三角形を生成します(長い三角形を並べ替えます)。 |
| Delaunay Triangulation Retrict To Planes | 3Dナビメッシュにおいて、Delaunay triangulationで三角形を並べ替えると、斜面でナビメッシュが変形することがあります。この挙動はUnitysナビメッシュでも顕著で、ナビメッシュの高さがゲームプレイに使われる場合(ナビメッシュの上を歩くなど)、ゲームに影響を与えることがあります。 このオプションをチェックすると、三角形分割を同一平面上にある三角形に制限することができます。 |
| Fix Triangles On Edges | インポートされた頂点が他の三角形のエッジ上にある場合があり、不要な境界線の検出につながります。 このオプションを使用すると、そのような三角形を分割できます。 |
| Closest Triangle Calculation | navmeshのないマップグリッドの領域は、最も近い傍を検出する必要があります。この計算は非常に遅いです。SpiralOutオプションはより高速ですが、フォールバック三角形はnullになる可能性があります。 |
| Closest Triangle Calculation Depth | SpiralOutを使用するときに三角形を各方向に検索するセルの数。 |
| Enable Quantum_XY | QUANTUM_XY定義が設定されている場合にのみ表示されます。これをオンに切り替えると、navmeshベイク処理によりYとZが反転し、XY平面で生成されたナブメッシュに対応できます。 |
| Min Agent Radius | navmeshが対応する最小エージェント半径。 この値は、navmeshと視覚的な境界の間のマージンです。値は、エディターでベイク処理するときに、Unity navmeshベイク設定(またはサーフェス設定)から取得することによって上書きされます。 |
Navmeshサーフェスの使用
Unity navmesh surfaceアドオンを使用すると、以下のような利点があります。
- ランタイムnavmesh計算が可能です(これはクライアント間で確定的に実行できないことに注意してください。生成されたnavmeshバイナリデータは送信する必要があります)
- 複数のナブメッシュを作成するのは簡単です。
NavMeshModifierスクリプトを使用すると、Unityのnavmeshアイランドの問題を軽減できます(Quantum FAQを参照)- 内部設定のより詳細な制御
NavMeshSurfacesリストに追加することで、複数のサーフェスをQuantum navmeshにリンクできます。1つのnavmeshのマップベイク中、シーン内の他のサーフェスは一時的に非アクティブになります。
カスタムのベイキングオプション
MapNavMeshBaker.BakeNavMesh()は基本的なQuantum navmeshベイキングメソッドであり、入力データとして MapNavMesh.BakeDataを使用します。デフォルト設定では、ベイクデータはインポートされたUnity navmesh三角形分割から生成されます。カスタム設定では、自分でそのデータ構造を入力できます。 基本的には三角スープだけです。
navmeshベイキングは、以下のように様々な方法でカスタマイズできます。
MapDataBakerCallbackから派生して、Bakingパイプラインに静的コードを追加する。OnCollectNavMeshBakeDataを実装し、既存のMapNavMesh.BakeDataを変更したり、新しいMapNavMesh.BakeDataをパイプラインに注入します。OnCollectNavMeshesを実装し、既存のNavMeshオブジェクトを修正したり、シリアライズされる新しい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 に含まれるメソッドは、マップベーキングの処理中にリフレクションによって呼び出されます。アセンブリ定義の外にあるパブリックなクラスでメソッドを埋めるだけです。GameObjectをインスタンス化する必要はありません。マップアセットベーキングパイプラインの詳細については、マニュアルの_Asset_のページを参照してください。
パスファインディングの可視化
QuantumEditorSettingsのパスファインダーギズモ Draw Pathfinder Funnel を有効にしてシーンビューにパスギズモを表示します。
SimulationConfigのThread Countを 1 に設定すると、ギズモが毎回動作するようになります。