ナビメッシュリージョンの使用
ナビメッシュリージョンの使用
Quantum は、決定論的ロールバックを考慮しながらナビメッシュリージョンを実装しています。これにより、Unity の動的ナビメッシュのかき割り機能との妥協が可能です。リージョンは、非常に少ないパフォーマンスオーバーヘッドで事前定義されたエリアのナビメッシュを動的にオンおよびオフに切り替えるために使用できます。
リージョンは三角形内にマスクとしてエンコードされているため、Advanced
地域インポートモードの ID によって各マップで使用できる異なるリージョンの最大数は 64 です(Navigation.Constants.MaxRegions
)。Advanced
モードでは、異なるリージョンに同じ ID を再利用することが可能です。
Walkable
エリアは常にリージョン 0 に変換され、MainArea
と呼ばれます。
マップのすべてのリージョンは、リスト Map.Regions
でアクセスできます。リージョン ID は整数で、そのマップ内のリージョンのインデックスを参照します。このインデックスは Map.RegionMap
ルックアップを使用して取得できます。
ナビメッシュリージョンのインポート
Quantum ナビメッシュリージョンを Unity ナビメッシュからインポートする方法は、2 つの異なるモードで行うことができます。

シンプル(Quantum SDK 3.0.1)
Unity ナビメッシュエリアは、リージョンとして直接マッピングされ、それぞれのエリア名が付けられます。
これにより、合計で 30 の異なるリージョンに制限されます。
高度
追加のスクリプト(QuantumNavMeshRegion
)とメッシュを持つ GameObject を Unity シーンに追加する必要があります。Unity ナビメッシュエリアは、リージョンをマークするためだけに使用され、インポート中に Unity ナビメッシュの三角形化から元のリージョンスクリプトに戻すように試みられ、最終的なリージョン名が含まれます。
これにより、1 マップにつき 64 の異なるリージョンが可能になります。
ステップバイステップチュートリアル
ステップ 1) Unity のナビゲーションエリアにエリアを追加します(Window > AI > Navigation
)

ステップ 2) リージョンインポートモードを選択し、Quantum ナビメッシュインポート記述オブジェクト MapNavMeshUnity
でリージョンに変換すべきエリアを切り替えます。

ステップ 3) [高度モードのみ] Quantum リージョンキャスター スクリプトをセットアップします。
Unity は MeshRenderer
を使用してエリアをナビメッシュに投影します。MeshRenderer
を持つ GameObject を作成し、MapNavMeshRegion
を添付します。

Id
は、コードを介して Map.RegionMap
からアクセス可能なユニークな文字列であり、後でリージョン ID(整数、フラグ)を取得できます。
CastRegion
は CastRegion
に設定する必要があります。このスクリプトは、ナビメッシュにリージョンを投影する必要がないオフメッシュリンクにも再利用されます。
NavMeshHelper
は、GameObject が正しく設定されているかどうかを示します。例えば、static
に設定されているか、選択した上書きエリアがリージョンエリアであるかなど。
ナビメッシュインポート中は、ナビメッシュ三角形がオリジナルのリージョンスクリプトに一致するようにマッチします。
三角形が完全に正確に生成されないため、MapNavMeshUnity
には、フィッティング中にマージンを追加する設定があります(RegionDetectionMargin
)。リージョンがエクスポートされない場合、この値を増やすことができますが、大きすぎると隣接リージョンの検出に問題が生じる可能性があります。
MeshRenderer
とリージョンスクリプトは、ベーキング中にのみアクティブにする必要があります。
ステップ 4) 現在、BakeAll
ボタンを使用して地図をベイクできます(ナビメッシュベイキング手順を含む)。
マップの GameObject を選択すると、Quantum ナビメッシュギズモが表示されます。ナビメッシュ内の三角形の色付きエリアがリージョンです。ギズモが表示されない場合は、シーンタブの右クリック > オーバーレイ > Quantum Gizmos
を選択してください。

ステップ 5) シミュレーション中にリージョンをグローバルに切り替えます。
C#
public override void OnInit(Frame f) {
var regionId = f.Map.RegionMap["foo"];
f.NavMeshRegionMask->ToggleRegion(regionId, false);
}
NavMeshPathfinder
コンポーネントにも、個々のエージェントのためにリージョンをオフにするための RegionMask が含まれています。
次のスクリーンショットは、エージェントが周囲を移動する際に非アクティブなリージョンを示しています。

ステップ 6) リージョンのアクティベーションはアクセス可能で、フレームに保存されます。
新しいマップがロードされるとマスクをリセットする必要があります。例えば、ISignalOnMapChanged
シグナルの中で FrameBase.ClearAllNavMeshRegions()
を実行します。
C#
public class ResetRegionsSystem : SystemSignalsOnly, ISignalOnMapChanged {
public void OnMapChanged(Frame f, AssetRefMap previousMap) {
f.ClearAllNavMeshRegions();
}
}
NavMeshRegionMask クラス
NavMeshRegionMask
オブジェクトは、内部ビットセットを使用してどのリージョンが有効になっているかを制御します。
NavMeshRegionMask.Default
- すべてのリージョンが有効なリージョンマスクを作成します。
NavMeshRegionMask.MainArea
- MainArea のみを含むリージョンマスクを作成します。
NavMeshRegionMask.Empty
- 有効なリージョンを持たないリージョンマスクを作成します。
NavMeshRegionMask.ToggleRegion(int region, bool enabled)
- リージョン ID を使用してリージョンをオンまたはオフに切り替えます。
NavMeshRegionMask.IsRegionEnabled(int region)
- リージョンが有効かどうかをテストします。
NavMeshRegionMask.Clear()
- マスクをリセットし、すべてのリージョンを有効に設定します。