Unityナビメッシュのインポート
Quantumナビメッシュ生成は、Unityナビメッシュのパイプライン上に構築されていて、Unityナビメッシュ三角形分割をインポートして、Quantumナビメッシュバイナリ形式にベイクします。
原点位置のナビメッシュのみがサポートされ、ベイク処理ではワールド座標がQuantumナビメッシュに書き込まれます。Quantum物理エンジンと同様に、固定小数点精度の問題を回避するため、原点付近でゲームプレイを行うことが推奨されます。
Unityナビメッシュのインポート
Unity Package Manager > Unity Registryから、UnityプロジェクトにAI Navigationパッケージcom.unity.ai.navigationを追加してください。
Unityの
NavMesh Surfaceを作成・セットアップします。
QuantumMapData配下に新しいゲームオブジェクトを作成し、QuantumMapNavMeshUnityスクリプトを追加します。
NavMesh SurfaceゲームオブジェクトをNav Mesh Surfacesリストに追加します。
マップオブジェクトを選択し、
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接尾辞)は、マップアセットと同じ場所に置かれます。
ベイク完了後、
QuantumMapDataスクリプトのNav Mesh Linksから、ナビメッシュアセットを参照します。
マップオブジェクトを選択すると、Quantumナビメッシュのギズモが表示されます。ギズモ描画を切り替えるには、Quantum Gizmosオーバーレイメニューを開いてください。(Sceneタブを右クリック > Overlay Menu > Quantum Gizmos)
QuantumEditorSettingsから任意で、自動ビルドモードによるナビメッシュ構築に切り替えることもできます。
ゲーム起動時には、
RuntimeConfigに設定されているSystemsConfigにQuantum.Core.NavigationSystemを追加してください。デフォルトでは、このシステムは正しく追加されて有効化されています。
インポート設定
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 Serialize Type
この設定は、ナビメッシュアセットのどれをシリアライズするか?どれをロード時に生成するか?を制御します。これによってアセットサイズを削減し、実行時にアセットを作成してクライアントへ送信する際に便利です。(詳細はカスタムナビメッシュ生成をご覧ください)
| Full |
完全なデータをシリアライズしますが、メタデータはロード後に計算します。
デフォルト値です。 |
サイズ中 |
| FullWithMetaData | 完全なデータとメタデータ(例:法線)をシリアライズします。 | サイズ大 |
| BakeDataOnly |
NavMeshBakeDataのみをシリアライスし、実行時にナビメッシュをベイクします。
|
サイズ最小 |
NavMesh Area / NavMesh Grid
NavMesh AreaとNavMesh Gridのギズモは、Quantum Navmeshオーバーレイメニューから有効にすると、シーンにレンダリングされます。
グリッドは、QuantumMapDataスクリプトのNavMesh Settingsから設定できます。全体のグリッドサイズは、X/Y/Z方向のセル数と、ノードサイズ(Unity単位でのセル寸法)によって決まります。
ナビメッシュグリッドエリアは、ナビメッシュ全体(左側のスクリーンショットの青枠)を包含する必要があります。
グリッドセル(右側のスクリーンショットの黄枠)は、含まれるナビメッシュ三角形が多すぎないような適切なサイズにする必要があります。ナビメッシュデータサイズとパフォーマンスはトレードオフです。セルが小さいほどデータ構造は大きくなりますが、経路探索時に調べる三角形が少なくなります。
|
|
ナビメッシュのワールド座標が原点付近にない場合でも、グリッドエリア内に収める必要があります。
カスタムナビメッシュベイクコールバック
ナビメッシュベイクプロセスは、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