This document is about: QUANTUM 3
SWITCH TO

ナビメッシュリージョンの使用

ナビメッシュリージョンの使用

Quantum は、決定論的ロールバックを考慮しながらナビメッシュリージョンを実装しています。これにより、Unity の動的ナビメッシュのかき割り機能との妥協が可能です。リージョンは、非常に少ないパフォーマンスオーバーヘッドで事前定義されたエリアのナビメッシュを動的にオンおよびオフに切り替えるために使用できます。

リージョンは三角形内にマスクとしてエンコードされているため、Advanced 地域インポートモードの ID によって各マップで使用できる異なるリージョンの最大数は 64 です(Navigation.Constants.MaxRegions)。Advanced モードでは、異なるリージョンに同じ ID を再利用することが可能です。

Walkable エリアは常にリージョン 0 に変換され、MainArea と呼ばれます。

マップのすべてのリージョンは、リスト Map.Regions でアクセスできます。リージョン ID は整数で、そのマップ内のリージョンのインデックスを参照します。このインデックスは Map.RegionMap ルックアップを使用して取得できます。

ナビメッシュリージョンのインポート

Quantum ナビメッシュリージョンを Unity ナビメッシュからインポートする方法は、2 つの異なるモードで行うことができます。

Region Import Modes

シンプル(Quantum SDK 3.0.1)

Unity ナビメッシュエリアは、リージョンとして直接マッピングされ、それぞれのエリア名が付けられます。

これにより、合計で 30 の異なるリージョンに制限されます。

高度

追加のスクリプト(QuantumNavMeshRegion)とメッシュを持つ GameObject を Unity シーンに追加する必要があります。Unity ナビメッシュエリアは、リージョンをマークするためだけに使用され、インポート中に Unity ナビメッシュの三角形化から元のリージョンスクリプトに戻すように試みられ、最終的なリージョン名が含まれます。

これにより、1 マップにつき 64 の異なるリージョンが可能になります。

ステップバイステップチュートリアル

ステップ 1) Unity のナビゲーションエリアにエリアを追加します(Window > AI > Navigation

Region Areas

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

Add Region Area

ステップ 3) [高度モードのみ] Quantum リージョンキャスター スクリプトをセットアップします。

Unity は MeshRenderer を使用してエリアをナビメッシュに投影します。MeshRenderer を持つ GameObject を作成し、MapNavMeshRegion を添付します。

Region Setup

Id は、コードを介して Map.RegionMap からアクセス可能なユニークな文字列であり、後でリージョン ID(整数、フラグ)を取得できます。

CastRegionCastRegion に設定する必要があります。このスクリプトは、ナビメッシュにリージョンを投影する必要がないオフメッシュリンクにも再利用されます。

NavMeshHelper は、GameObject が正しく設定されているかどうかを示します。例えば、static に設定されているか、選択した上書きエリアがリージョンエリアであるかなど。

ナビメッシュインポート中は、ナビメッシュ三角形がオリジナルのリージョンスクリプトに一致するようにマッチします。

三角形が完全に正確に生成されないため、MapNavMeshUnity には、フィッティング中にマージンを追加する設定があります(RegionDetectionMargin)。リージョンがエクスポートされない場合、この値を増やすことができますが、大きすぎると隣接リージョンの検出に問題が生じる可能性があります。

MeshRenderer とリージョンスクリプトは、ベーキング中にのみアクティブにする必要があります。

ステップ 4) 現在、BakeAll ボタンを使用して地図をベイクできます(ナビメッシュベイキング手順を含む)。

マップの GameObject を選択すると、Quantum ナビメッシュギズモが表示されます。ナビメッシュ内の三角形の色付きエリアがリージョンです。ギズモが表示されない場合は、シーンタブの右クリック > オーバーレイ > Quantum Gizmos を選択してください。

Active Regions

ステップ 5) シミュレーション中にリージョンをグローバルに切り替えます。

C#

public override void OnInit(Frame f) {
    var regionId = f.Map.RegionMap["foo"];
    f.NavMeshRegionMask->ToggleRegion(regionId, false);
}

NavMeshPathfinder コンポーネントにも、個々のエージェントのためにリージョンをオフにするための RegionMask が含まれています。

次のスクリーンショットは、エージェントが周囲を移動する際に非アクティブなリージョンを示しています。

Inactive Regions

ステップ 6) リージョンのアクティベーションはアクセス可能で、フレームに保存されます。

新しいマップがロードされるとマスクをリセットする必要があります。例えば、ISignalOnMapChanged シグナルの中で FrameBase.ClearAllNavMeshRegions() を実行します。

C#

public class ResetRegionsSystem : SystemSignalsOnly, ISignalOnMapChanged {
    public void OnMapChanged(Frame f, AssetRefMap previousMap) {
        f.ClearAllNavMeshRegions();
    }
}

NavMeshRegionMask オブジェクトは、内部ビットセットを使用してどのリージョンが有効になっているかを制御します。

NavMeshRegionMask.Default - すべてのリージョンが有効なリージョンマスクを作成します。
NavMeshRegionMask.MainArea - MainArea のみを含むリージョンマスクを作成します。
NavMeshRegionMask.Empty - 有効なリージョンを持たないリージョンマスクを作成します。

NavMeshRegionMask.ToggleRegion(int region, bool enabled) - リージョン ID を使用してリージョンをオンまたはオフに切り替えます。
NavMeshRegionMask.IsRegionEnabled(int region) - リージョンが有効かどうかをテストします。
NavMeshRegionMask.Clear() - マスクをリセットし、すべてのリージョンを有効に設定します。

Back to top