World Partition により、クリエイターは大規模で複雑な島をビルドできるようになりました。また同時に、メモリコストの改善や、異なるプラットフォーム間でのスムーズなパフォーマンスも実現しています。
World Partition では、これを達成するために 2 つの重要なコンポーネント、ストリーミングと HLOD (階層型詳細レベル) を使用しています。
ストリーミング
World Partition はストリーミングを使用して、プレイヤーの周囲のグリッド セル、またはストリーミング ソースをメモリの内外にロードします。 これにより、マシンがプレイヤー キャラクターを囲むセルに記憶しなければならないデータの量が減ります。
島が最も広い軸で 1 km を超える場合は、ストリーミングをオンにするよう求めるポップアップが表示されます。
[Enable Streaming (ストリーミングを有効化)] をオンにすると、一部の例外を除き、プレイヤーの現在位置を囲むセルのみが [Current Memory Usage (現在のメモリ使用量)] にカウントされるようになります。
[Window (ウィンドウ)] > [World Settings (ワールド セッティング)] をクリックして、[Enable Streaming (ストリーミングを有効化)] がオンになっているかどうかを確認します。
初めてこのボックスをオンにすると、選択を確認する必要があります。
これでプロジェクトでストリーミングが有効になりました。
島のグリッドを視覚化するには、[World Settings (ワールドセッティング)] の [Preview Grids (プレビューグリッド)] をオンにします。
各セルのサイズと読み込み範囲を変更することもできます。デフォルト設定ではフォートナイト バトルロイヤルのサイズの島に最適化されている点にご留意ください。
詳細は、Unreal Engine 5 ドキュメントの「World Partition」ページを参照してください。
HLOD
Hierarchical Level of Detail つまり HLOD は、近くのアクタの最適化されたグループ化であり、ストリーミング ソースから十分に離れると、グループは 1 つのスタティックメッシュに単純化されます。
HLOD は、アセットの最も忠実度の低い詳細度 (LOD) から生成されます。 カスタム アセットに LOD が設定されていない場合、HLOD はフル解像度のアセットから生成されるため、非常に多くのコストがかかります。
LOD0 の場合、最高の忠実度のアセットとなります。 LOD1 はそれより忠実度の低いメッシュとなり、LOD 数が増加するにつれて低下し続けます。
左の画像はアセットの詳細、右の画像はそのグリッド セルから生成された HLOD アセットを 示しています。
HLOD をビルドすると、プロジェクトに新しいアセットが追加され、島の総メモリ使用量が増加します。
ストリーミングと HLOD に関する決定に応じて、メモリ使用量に次のような影響が生じます。
ストリーミング オフ | アセットがメモリからアンロードされることはなく、HLOD も使用されません。 | メモリ使用量が最も多い |
ストリーミング オン および HLOD 生成済み | アセットが離れたところにある場合でも表示されます。ただし、カメラが離れるにつれて詳細度が低下します。 | メモリ使用量が中程度 |
ストリーミング オン および HLOD 未生成 | カメラが離れると、離れたところにあるアセットが表示されなくなります。 | メモリ使用量が最も少ない |
HLOD をビルドする
HLOD をビルドするには、プロジェクトでストリーミングが有効になっていることを確認してから、ツールバーの [Build (ビルド)] に移動し、[Build HLODs (HLOD をビルド)] を選択します。
マシンとワールドの複雑さによっては、HLOD のビルドに時間がかかる可能性があります。 ただし、このプロセスを再度実行した場合、変更された世界の地域の HLOD のみがビルドされることから時間が短縮されます。
HLOD の仕組みの詳細は、Unreal Engine 5 ドキュメントの「World Partition - Hierarchical Level of Detail」ページを参照してください。
HLOD の生成からアセットを除外する
一部のアセットは HLOD を必要としません。 除外できるアセットの例を次に示します。
屋内の小道具と建物アセット | 遠くから視認できないアセットには、HLOD は必要ありません。 例としては、家具、室内の壁、室内の床などがあります。 |
地下アセット | 島の地下にあり、プレイヤーの視界に入らない部分です。 例としては、地下室、洞窟、塹壕、掩蔽壕などがあります。 |
小アクタ | プレイヤーの画面の大部分を占めない小さなアクタには、HLOD は必要ありません。 例としては、箱、植物、街灯などがあります。 |
大アクタ | 高層ビルや山のような大きなバックグラウンド アクタには HLOD は必要ありません。 それらを HLOD から除外する場合、[Details (詳細)] パネルで [Is Spatially Loaded (空間にロード)] のチェックを外し、それらが常にロードされた状態となるようにします。 |
HLOD を必要としないアセットを選択します。 [Details (詳細)] パネルで、アセットに応じて [Include Actor in HLODs (アクタを HLOD に含める)] または [Include Component in HLODs (コンポーネントを HLOD に含める)] のチェックを外します。
経験則としては、アセットを HLOD に含めるかどうかの決定は、エディタでズームアウトして重要でないアセットを HLOD の生成から除外することが合理的であるかどうかを検討するのが良いでしょう。
ロード範囲を押し戻す
HLOD の品質は、予想される描画距離に関連付けられています。 ストリーミングを使用する場合、HLOD が表示される最短距離は、World Partition グリッド用に構成した読み込み範囲となります。
HLOD がプレイヤーの画面上で、すでに小さいときにのみ読み込まれる場合、使用するストレージは少なくなります。
ロード範囲を変更するには、次の手順を実行します。
[WORLD PARTITION SETUP (WORLD PARTITION セットアップ)] タブを選択します。
[Runtime Settings (ランタイム設定)]、次に [Grids (グリッド)] を展開します。
数値を左クリックして左または右にドラッグするか、正確な値を入力して、ロード範囲を変更します。
[Loading Regions (領域をロード)] を使用してエディタのパフォーマンスを高める
UEFN で大規模なプロジェクトに取り組んでいる場合、島が特定のサイズに達すると、徐々にパフォーマンスに問題が出ることがあります。 デフォルトでは、島全体がメモリにロードされます。 フレームレートおよびビューポートの応答性を改善するために、島の異なるエリアで作業するときに領域をロード/アンロードすることができます。
UEFN エディタで大規模な島や密集した島の作業を行う場合は、World Partition のミニマップを使用して島のセクションをロード/アンロードすることで、ロード時間を大幅に短縮できます。
装備の手順は以下の通りです。
レベルで Streaming (ストリーミング) が有効になっていることを確認します。
メニューバーから [Edit (編集)] を選択し、[Editor Preferences... (エディタの環境設定...)] を選択します。
[World Partition] セクションに移動し、[Disable Loading in Editor (エディタでのロードを無効化)] をオフにします。
プロジェクトをリロードします。 この機能は、プロジェクトをリロードしない限り、機能しません!
[World Partition] タブで、アンロードしたいエリアを左クリックしてドラッグします。
選択範囲内で右クリックし、[Unload Selected Regions (選択中の領域をアンロード)] を選択します。
領域をリロードするには、目的の領域をクリックしてドラッグし、右クリックして、[Load Region From Selection (選択から領域をロード)] を選択します。
全ての風景と仕掛けは、ロード/アンロードの影響を受けません。 これは、[User Options (ユーザー オプション)] で [Is Spatially Loaded (空間的にロードする)] がオフになっているアセットにも該当します。
UEFN のデータ レイヤー
データ レイヤーは、アクタをさまざまなレイヤーに整理するために使用される、UEFN にあるシステムです。 これらのレイヤーをロードおよびアンロードすることで、ワールドを整理して複雑なレベルを管理し、独自のゲームプレイ体験を作り出すことができます。 ランダム化された複数のレベルを使用するゲームがあるとします。 レイヤーごとに異なるレベル レイアウトを設定し、ゲームの開始時にそのいずれかをランダムに選択することで、体験にバリエーションと刺激を加えることができます。 レベル全体を夏から冬に変えたり、戦闘の後に城への破壊を加えたりするといった、さらに大きな遷移にデータ レイヤーを使用することができます。
データ レイヤーの作成および管理の詳細は、「Unreal Engine ドキュメント サイト」にあるデータ レイヤーのページを参照してください。
ムービー シーケンサーを使用してデータ レイヤーを操作する
UEFN でムービー シーケンサーを使用して、ランタイム時およびイベントに応じてデータ レイヤーをロード、アクティベート、アンロードできます。
[Sequencer (シーケンサー)] タブで、[Track (トラック)] ボタンをクリックして [Data Layer (データ レイヤー)] を選択し、既存のデータ レイヤーをシーケンサー トラックに追加します。
トラックが設定されている状態で、[Data Layer (データ レイヤー)] トラックを右クリックし、[Edit Section (セクションを編集)] を選択します。 次に、[Data Layer Assets (データ レイヤー アセット)] タブの下にある [Add Element (要素を追加)] をクリックし、ムービー シーケンサーで使用するデータ レイヤーを選択します。
タイムライン上でデータ レイヤーを右クリックすると、そのプロパティが表示されます。 ここでは、タイムラインの評価時にレイヤーをどの状態にしたいかを指定する Desired State (希望する状態) を選択できます。 Preroll State (プリロール状態) を変更することもできます。 プリロール状態は、トラックが開始する前のレイヤーの状態であり、ポストロール状態は、トラックが終了した後の状態です。 たとえば、データレイヤーをアクティブにしたい場合は、Desired State (希望する状態) を Activated (アクティブ) に、Preroll State (プリロール状態) を Loaded (ロード済み) に設定します。 Preroll State (プリロール状態) を Loaded (ロード済み) に設定し、プリロール フレームを増やすことで、レイヤーがアクティブになる前により多くのロード時間を確保でき、パフォーマンスがより滑らかになる可能性があります。
再生ヘッドを動かすことで、タイムラインが評価されるときのレイヤーのステートをプレビューできます。
ムービー シーケンサーの仕掛けの使用方法の詳細については、「ムービー シーケンサー仕掛け」ページを参照してください。
エディタ ミニマップを生成する
オプションのステップとして、エディタのセッションで忠実度の高いミニマップを生成することができます。 これは、作業したいレベルのさまざまなエリアをすばやく見つけるうえで役立ちます。
メニューバーから [Build (ビルド)] を選択し、[Build World Partition Editor Minimap (World Partition エディタ ミニマップを作成)] を選択します。
[Build Status (ビルドのステータス)] ダイアログが画面に表示されます。 なお、島の複雑さによっては、この手順が完了するまでに数分かかることがあります。
これでミニマップがビューポートと一致します。 領域のロードとアンロードは引き続き同じ方法で実行できます。
トラブルシューティング
Q:HLOD をビルドした後に HLOD が表示されないのはなぜですか?
A:エディタでは、HLOD アクタはデフォルトでロードされません。 それらを調べるには、アウトライナー を使用して検索し、ピン留め します。
Q:アクタが互いに離れている場合、アセットが HLOD を生成するのはなぜですか?
A:アクタが親アクタの下にアタッチ/ネストされているかどうかを確認します。 アクタをクリックして、[Attach: none (アタッチ: なし)] を選択すると、そのアクタがデタッチされます。
Q:セルをアンロードすると、重要なアセットの一部が消えてしまいます。
A:一部の UEFN 対応アセットでは、デフォルトで [Include Actor in HLOD (アクタを HLOD に含める)] がオンになっていません。 問題が発生した場合は、アセットのプロパティを確認します。
Q:自分の島が 1 km を超えていないのに、ストリーミングのプロンプトがトリガーされるのはなぜですか?
A:風景がその最大幅軸で 1 km を超える場合、またはアクタがレベルの原点から 1 km 以上離れている場合は、ストリーミングのプロンプトがトリガーされることがあります。
Q:大きなアクタが遠距離にある HLOD に置き換えられないのはなぜですか?
A:プレハブの階層内の 1 つまたは多くのアクタがコピーされて遠くに移動されたため、World Partition がそれらを常にロードする必要のあるメッシュと見なしている可能性があります。 この問題を解決するには、遠距離にあるアクタを階層から削除します。