概要
このドキュメントでは、World Partition が設定された ナビゲーション メッシュ と Unreal Engine の World Partition システムを使用する方法についての概要を説明します。
World Partition は、大規模なワールドの管理向けの完全なソリューションを提供する、自動データ管理および距離ベースのためのレベル ストリーミング システムです。このシステムを使用すると、グリッド セルに分割された単一のパーシスタント レベルにワールドを保存することにより、大きなレベルをサブレベルに分割する必要がなくなります。また、ストリーミング ソースからの距離に応じてそれらのセルをロードおよびアンロードする自動ストリーミング システムも用意されています。
このシステムの詳細については、「World Partition」のドキュメントをお読みください。
ワールド パーティション化ナビゲーション メッシュ
World Partition Navmesh は、他のワールド パーティション リソースと同様にロード / アンロードされる複数の Navmesh チャンク アクタに分割されます。
World Partition Navmesh の使用は、ワールド パーティション化されたマップでのみ意味があります。ワールド パーティションを使用するようにマップを変換するには、「ワールド パーティション」のドキュメントを参照してください。
または、新しいレベルを作成し、「Open World」テンプレートを選択して、ワールド パーティション マップを作成することもできます。
Runtime Generation
World Partition ナビゲーション メッシュは、利用可能なすべての生成モードをサポートしています。Static (スタティック)、Dynamic Modifiers Only (ダイナミック モディファイアのみ)、Dynamic (ダイナミック) です。
Dynamic モード
Dynamic (動的) 生成モードを使用すると、実行時に Navmesh タイルの生成が行われます。ただし、ベース Navmesh の一部であるロードおよびアンロードされるオブジェクトについては、ナビゲーションのダーティネス (ナビゲーションを再ビルドする必要性) は無視されます (以下を参照)。これにより、ワールドのロードおよびアンロードの結果として過度に汚れてしまうことを防げます。
ワールド パーティション化されたダイナミック NavMesh を使用する場合、ダイナミック タイルのビルドは読み込まれたスペースに制限されます。
ベース ナビゲーション メッシュとデータ レイヤー
すべてのランタイム ナビゲーション生成モードは ベース Navmesh を使用します。これは、セルが読み込まれるときにストリーミング経由で読み込まれる最初の Navmesh を指します。
Static モードでは、この Navmesh は変更されません。ただし、動的モードでは、ナビゲーションに関連するスポーンされたアクタはベース Navmesh に対して汚れを発生させ、ナビゲーション タイルの再ビルドをトリガーします。
ベース Navmesh に含まれているもの
データ レイヤー外のナビゲーション関連オブジェクトは、ベース Navmesh に含まれます (つまり、最初の Navmesh にベイクされます)。さらに、エディタのデータ レイヤー内のオブジェクトも含まれます。
最後に、ベース Navmesh データ レイヤー リスト内のすべてのレイヤー (ランタイム データ レイヤーを含む) は、ベース Navmesh でも考慮されます。
World Partition データ レイヤーの詳細については、「データ レイヤー」のドキュメントを参照してください。
外部パッケージ化
ワールドパーティション化 Navmesh をビルドする場合、ナビゲーション データ アクタ (ANavigationData) は外部でパッケージ化されます。つまり、ワールドパーティション化 Navmesh をビルドしてもメイン マップは汚れません。
外部パッケージングの詳細については、「アクタあたり 1 つのファイル」のドキュメントを参照してください。
ワールド パーティション化ナビゲーション メッシュを作成する
1 - 必要な設定
-
[Games (ゲーム)] カテゴリのテンプレートから新規プロジェクトを作成します。この例では「Third Person (サードパーソン)」テンプレートを選択しています。
-
エディタで、[File (ファイル)] > [New Level (新規レベル)] の順にクリックします。[Open World (オープン ワールド)] マップ タイプを選択し、[Create (作成)] をクリックします。レベルを保存します。
Open World デフォルト マップ タイプは、大規模なオープン ワールド マップを作成するための開始点として設計されています。デフォルトで次の機能が有効になっています。
- World Partition
- One File Per Actor
- Data Layers
- 階層詳細度
-
[World Settings (ワールドセッティング)] ウィンドウに移動し、[World Partition] セクションまで下にスクロールします。
-
[Runtime Settings (ランタイム設定)] > [Grids (グリッド)] > [Index [0]] を展開します。
-
[Loading Range (ロードする範囲)] の値を「12800」に変更します。値を小さくするほど、World Partition によってナビゲーション メッシュがロードされる際に視覚化が簡単になります。
-
このセクションの結果
このセクションでは、World Partition を使用するように設定したレベルを備えた新しいプロジェクトを作成しました。次のセクションでは、ナビゲーション メッシュが World Partition と連携するように構成します。
2 - ナビゲーション メッシュが World Partition を使用するように構成する
-
[Settings (設定)] > [Project Settings (プロジェクト設定)] をクリックして [Project Settings] ウィンドウを開きます。
-
[Navigation Mesh (ナビゲーション メッシュ)] カテゴリをクリックし、[Runtime (ランタイム)] セクションまで下にスクロールします。[Runtime Generation (ランタイム生成)] ドロップダウンをクリックして [Static (スタティック)] を選択します。
-
プロジェクトに大きなワールドがある場合、[Generation (生成)] セクションに移動して [Fixed Tile Pool Size (固定タイル プール サイズ)] チェックボックスを有効にし、[Tile Pool Size (タイル プール サイズ)] を調整することで、メモリ使用率を制限できます。プール サイズは、ナビゲーション メッシュが使用するメモリ サイズを制限します。
プール内のタイルの数は、次を追加できるように十分な数にする必要があります。 実行時、ロード バブルに Navmesh アクタをロードするのに必要なタイルの最大数。 分割されたワールド マップの一部を読み込むときにエディタで視覚化するタイルの最大数。
-
[Add + (追加 +)] > [Volumes (ボリューム)] > [NavMeshBoundsVolume] をクリックし、ナビゲーション メッシュ ボリューム アクタをレベルに追加します。
-
[Outliner (アウトライナ)] ウィンドウで [NavMeshBoundsVolume] アクタを選択し、[Details (詳細)] パネルに移動します。
-
レベル内のプレイ可能空間をカバーするようにアクタを スケーリング します。
-
ビルド中のナビゲーションをビューポートで確認するには、P を押します。
-
-
[Outliner] ウィンドウで [RecastNavMesh-Default] アクタを選択し、[Details] パネルに移動します。[Generation] セクションまで下にスクロールし、[Is World Partitioned Navmesh] チェックボックスを 有効 にします。
このセクションの結果
このセクションでは、ナビ メッシュ バウンズ ボリュームをレベルに追加しました。また、World Partition と連携するようにナビゲーション メッシュを構成しました。
次のセクションでは、エディタを構成してワークフローを改善します。
3 - エディタを構成する
非常に大きなレベルで作業を行う場合が多いことから、ワークフロー改善のために自動ナビゲーション メッシュ生成を無効にすることをお勧めします。
これについては、以下の手順に従ってください。
-
[Edit (編集)] > [Editor Preferences (エディタの環境設定)] の順に選択すると、[Preferences (環境設定)] ウィンドウが開きます。
-
[Level Editor (レベル エディタ)] セクションまで下にスクロールして、[Miscellaneous (その他)] カテゴリをクリックします。[Editing (編集)] カテゴリまで下にスクロールし、[Update Navigation Automatically (ナビゲーションの自動更新)] チェックボックスをオフにします。
このセクションの結果
このセクションでは、ナビゲーション メッシュが自動的に更新されないように構成しました。これによって、通常、World Partition を使用する大規模なワールドで作業する際にワークフローが改善されます。
次のセクションでは、レベルでナビゲーション メッシュをビルドします。
4 - ナビゲーション メッシュをビルドする
World Partition を設定したマップで作業する際は、通常、一部のアセットがロードされる一方で、他のアセットはアンロードされます。そのため、ナビゲーション メッシュ全体のビルドには異なるプロセスが必要です。
レベルでナビゲーション メッシュをビルドするには、次の手順に従います。
-
コマンドラインに次のコンソール コマンドを入力し、Enter を押します。n.bNavmeshAllowPartitionedBuildingFromEditor 1
-
[Build (ビルド)] > [Build Paths (ビルド パス)] をクリックし、レベルでナビゲーション メッシュをビルドします。
-
[Build Navigation Settings (ビルド ナビゲーション設定)] ウィンドウで、[Ok] をクリックし、ナビゲーション メッシュをビルドします。次のオプションも利用できます。
-
Verbose (詳細) - ビルド プロセスのより詳細なログを確認する場合は、このチェックボックスをオンにします。プロジェクトの「Saved > Logs」ディレクトリに、「WPNavigationBuilderLog.txt」という名前の出力ログが作成されます。
-
Clean Packages (パッケージを消去) - すべての World Partition が設定された NavMesh アクタ パッケージをプロジェクトから削除する場合はこれをオンにします。これは、ナビゲーションをビルドしません。
-
-
ここで [Outliner] ウィンドウに移動すると、4 つの NavDataChunk アクタがあることがわかります。これらのアクタは、World Partition によってロードおよびアンロードされるナビゲーション データを保持します。作成される NavDataChunk アクタの数は、Data Chunk Grid のサイズによって異なります (詳細については、セクション 6 を参照してください)。
このセクションの結果
このセクションでは、レベルでナビゲーションをビルドする方法を学習しました。また、異なる [Navigation Settings] オプションと NavDataChunk アクタがレベル内に作成される仕組みについても学習しました。
次のセクションでは、エディタの外部でナビゲーションをビルドする方法を学習します。
5 - World Partition Navigation Data Builder を使用してナビゲーション メッシュをビルドする
WorldPartitionBuilderCommandlet と WorldPartitionNavigationDataBuilder を使用し、World Partition が設定されたスタティック ナビゲーション メッシュをエディタの外部でビルドすることもできます。
これを実行する方法の詳細については、「World Partition」のドキュメントの World Partition Navigation Data Builder のセクションの手順に従ってください。
6 - ナビゲーション メッシュの追加設定
-
[World Settings] ウィンドウに移動して [Navigation] セクションまで下にスクロールし、レベルの [Navigation Mesh (ナビゲーション メッシュ)] 設定を見つけます。
次のオプションが含まれます。
設定項目 説明 Navigation Data Chunk Grid Size (ナビゲーション データ チャンク グリッド サイズ) これは、World Partition の各セルを使用してロードされる、データ チャンク アクタのサイズを定義します。この数値が小さいほど、データは詳細になります。 Navigation Data Builder Loading Cell Size (ナビゲーション データ ビルダー ローディング セル サイズ) これは、ナビゲーション データをメモリにロードするのに使用される、ロードするセルのサイズを定義します。 [Navigation Data Chunk Grid Size (ナビゲーション データ チャンク グリッド サイズ)] は 25600 に設定します。この数値が小さいほど、World Partition によってロードおよびアンロードされるナビゲーション データの表示が高品質になります。この値は、ゲームプレイのニーズ、ロードする範囲、および必要な詳細度に基づいて調整する必要があります。
-
[Build (ビルド)] > [Build Paths (ビルド パス)] をクリックし、レベルでナビゲーション メッシュをビルドします。
-
ここで [Outliner] ウィンドウに移動すると、レベルにさらに多くの NavDataChunk アクタがあることがわかります。この原因としては、チャンク グリッド サイズが前よりも小さかったことが考えられます。
このセクションの結果
このセクションでは、[Navigation Data Chunk Grid Size] の変更方法、およびレベル内で作成される NavDataChunk アクタの数への変更の影響について説明しました。
次のセクションでは、プレイヤーがレベルを移動する際にレベルでナビゲーション メッシュのロードおよびアンロードがどのように行われるのかを説明します。
7 - ワールド パーティションの設定
ナビゲーション メッシュ設定に加えて、次のワールド パーティション設定でマップをセットアップすることもできます。
コマンド | 説明 |
---|---|
wp.Runtime.RuntimeSpatialHashPlacePartitionActorsUsingLocation = 0 | 0 に設定すると、パーティション アクタは、ロードする必要があるかどうかを確認する際に (その場所ではなく) その境界を使用します。これは、ロードする半径が小さい大きなランドスケープ タイルを使用する場合に便利です。 |
s.ForceGCAfterLevelStreamedOut = 1 | この設定は、レベルがストリーミングされた後にガベージ コレクションを強制します。これにより、World Partition によってアンロードされた Navigation アクタが削除されます。そうでない場合は、アンロードされたアクタが収集されるまでに時間がかかる場合があります。 |
8 - 結果を表示する
World Partition のセルを使用して、どのようにナビゲーション メッシュがロードおよびアンロードされるかを表示するには、以下の手順を実行します。
-
コマンドラインに次の Navigation Mesh Gameplay Debugger コンソール コマンドを入力し、Enter を押します。
-
ai.debug.nav.RefreshInterval 0.3
-
ai.debug.nav.DisplaySize 100
これらのコマンドにより、ナビゲーション メッシュのビジュアライゼーションの表示サイズおよび更新頻度が調整されます。
-
-
ゲームを開始するには、[Play (プレイ)] を押します。チルダ (~) を押してコマンドラインを開き、次の World Partition デバッグ コマンドを入力します。
-
wp.Runtime.ToggleDrawRuntimeHash2D
-
wp.Runtime.ShowRuntimeSpatialHashGridLevel 2
これらのコマンドを使用すると、プレイヤーに対してロードされる World Partition のセルが表示されます。
-
-
単一引用符 (') を押して [Gameplay Debugger (ゲームプレイ デバッガー)] を有効にし、ゼロ (0) を押して ナビゲーション ビューに切り替えます。これで、プレイヤーに対してロードされるナビゲーション メッシュを表示できます。
-
レベルを動き回ると、各 World Partition のセルがプレイヤーに対してロードされる際にナビゲーション メッシュがどのようにロードされるかが表示されます。
このセクションの結果
このセクションでは、World Partition によってナビゲーション メッシュがロードおよびアンロードされる際にどのように視覚化されるのかをご紹介しました。