160.2K Views
March 05, 24
スライド概要
Unreal Engine 5で導入された広大なワールドを作成するための機能であるWorldPartitionのこれまでとこれからを解説いたします。
Unreal Engine Meetup Connect - ゲーム開発編 - Vol.1 の中での講演資料になります。
2024/9/26 SubWorldPartitionについて追記し、いくつかのページも併せて調整しました。
アーカイブ動画:
https://www.youtube.com/live/nzKB5sCBCnk?si=ujPx55_yqWyLhjZC
イベントページ:
https://leon-gameworks.connpass.com/event/305752/
Unreal Engineを開発・提供しているエピック ゲームズ ジャパンによる公式アカウントです。 勉強会や配信などで行った講演資料を公開しています。 公式サイトはこちら https://www.unrealengine.com/ja/
World Partition 2024 Senior Software Engineer, Developer Relations Takashi Suzuki 2024 Epic Games Japan
アンケート : ワールドパーティションははじめて?
アンケート : ワールドパーティションははじめて? そうだよ! ちがうよ! 初耳だよ! 名前は聞いたことある 様子見してる! プロだよ! まだ慌てる時間じゃない 使ってるよ!
WorldPartition のおさらい WorldPartitionCell 目次 DataLayer LevelInstance HLOD
WorldPartition のおさらい WorldPartitionCell 目次 DataLayer LevelInstance HLOD
単一レベル構成 パーシスタントレベル
サブレベルワークフロー パーシスタントレベル 背景サブレベル 敵セットアップサブレベル VFX&ライトサブレベル
サブレベルワークフロー パーシスタントレベル リ スト ング ミ ー
オープンワールド パーシスタントレベル
そこでワールドパーティション の登場 ワールドの自動分割 同時編集 シームレスな体験 広大なワールドを自動的に 分割 多くの開発者が同時に編集 ストリーミングでメモリを 有効活用
Data Layer Level Instance ワールドパーティション のツール群 World Partition OFPA PCG HLOD
Data Layer ワールドパーティション Level Instance ● ● ● ワールド分割機能 エディタ上では単一のレベル PIE開始時/クック時に分割し ストリーミングレベルに変換 ○ セルと呼ばれる World Partition OFPA PCG HLOD
Data Layer Level Instance データレイヤー World Partition ● ● OFPA エディタ上でのフィルタ 条件付ストリーミング PCG HLOD
Data Layer HLOD ● ● ● 遠景の解決 自動で入れ替え 最適化メッシュ の自動作成 Level Instance World Partition OFPA PCG HLOD
Data Layer Level Instance レベルインスタンス World Partition ● ● OFPA 編集の効率化 再利用性 PCG HLOD
Data Layer One file per actor ● ● ● レベルの同時編集 1アクターに1ファイル 別名 ExternalActors Level Instance World Partition OFPA PCG HLOD
Data Layer PCGフレームワーク Level Instance World Partition ● ● OFPA ビジュアルスクリプティング アクターの自動配置 PCG HLOD Unreal Engine 5で極める!プロシージャル技術 https://www.docswell.com/s/EpicGamesJapan/ZQ8QY7-2023-12-22-105649 UnrealEngine5 ElectricDreams環境サンプルにみるプロシージャル生成テクニック https://www.docswell.com/s/EpicGamesJapan/5VVJXV-UE5_CEDEC2023_ElectricDreams
WorldPartition のおさらい WorldPartitionCell 目次 DataLayer LevelInstance HLOD
ワールドパーティション 対応レベルの作り方 ● ● テンプレートから作成 コマンドレットから変換 ○ WP -> 非WP は不可
ワールドパーティション 対応レベル? ● ● WorldPartitionEditorWindow UWorld 内にUWorldPartition オブ ジェクトがあるかどうか
ワールド分割 ● 2Dセル ● アクター振り分け ○ ● スライスされるわけではない 距離ベースのストリーミング
範囲内のセルを 自動的にストリーミング HLOD(遠景描画)の非表示 wp.Runtime.HLOD 0
分割設定設定 ● World Settings > Runtime Settings > Grids ○ Cell Size ○ Loading Range ○ Priority
WorldPartitionStreamingSource ● ● 追加のロード範囲設定 ファストトラベルなどの実現 Cellの状態を2Dオーバーレイ表示 wp.Runtime.ToggleDrawRuntimeHash2D
WorldPartitionStreamingSource ● コンポーネントをアクターに追加
PlayerController も ストリーミングソース ● ● ● Enable Streaming Source ○ ストリーミングソースとして扱うか Radius / Loading Range Scale ○ 動的なローディング距離指定など 角度指定 ○ 後方はロードしない設定など
ロードが終わっていることを 判定するには?
グリッドレベルと プロモーション
グリッドレベルと プロモーション
● ● ● グリッドレベル ○ 段階的に拡大するセル プロモーション ○ どのセルにも割り当てられなかった アクターをより上位のグリッドレベル に割り当てること なにがおこるか ○ 一部のアクターがなかなかストリー ムアウトしない ○ 巨大なHLOD(遠景メッシュ)をビルド してしまう
グリッドレベルと プロモーション |- [+] Content of Cell P_WP2024_MainGrid_L0_X-5_Y-7 (F47H2XTYZ035L2RKY7EHF6O91) | |- Actor Count: 1 | |Actor Path: /Game/P_WP2024.P_WP2024:PersistentLevel.LandscapeStreamingProxy_01GUB102XB9UEU82Z06W44ZQE_31_3_1_0 | |Actor Package: /Game/__ExternalActors__/P_WP2024/0/OK/ALIMNX4D4ZDGRKFP2OK6H1 | |- Actor Instance Guid: 483F551A4C6D95CC33F675A5A57AB8C3 [+] Content of Grid Level 1 |- [+] Content of Cell P_WP2024_MainGrid_L1_X-1_Y0 (DEVU3A5QBBJBDRNMMU78AJXIL) | |- Actor Count: 1 | |Actor Path: /Game/P_WP2024.P_WP2024:PersistentLevel.BPP_PLA_Building1_C_UAID_E04F43E67239C7CF01_1281111980 | |Actor Package: /Game/__ExternalActors__/P_WP2024/0/3P/N9MUW0BERHD6Q349I84V22 | |- Actor Instance Guid: D02D8B2843A788249367B9B2F5C59058 [+] Content of Grid Level 2 [+] Content of Grid Level 3 /Saved/Logs/WorldPartition/*.log [+] Content of Grid Level 4 [+] Content of Grid Level 5
グリッド分割設定 ~5.2 CVar による設定 【注意】 UseAlignedGridLevels=true PlaceSmallActorsUsingLocation=fasle が設定されていると アクターがどのセルにも入らない問題 が出やすくなります。 wp.Runtime.RuntimeSpatialHashUseAlignedGridLevels=false wp.Runtime.RuntimeSpatialHashSnapNonAlignedGridLevelsToLowerLevels=false wp.Runtime.RuntimeSpatialHashPlaceSmallActorsUsingLocation=true wp.Runtime.RuntimeSpatialHashPlacePartitionActorsUsingLocation=true
グリッド分割設定 WorldSettings 内設定 5.3~
カスタムハッシュと 3Dハッシュ 5.4
ミニマップ ● World Partition Editor ウィンドウ ● 矩形選択した範囲をロード ● 次回起動時にロード範囲を復元
ミニマップ LocationVolume ● Convert Selected Region(s) To Actor(s) で作成する ● 選択範囲をアクター化 ○ ● チームで共有できる ミニマップに常に表示される
BugIt ● カメラの位置をクリップボードに出力 ● コンソールコマンドとして実行するカメ ラを移動し、周辺を自動でロードする ● Wikiなどに纏めておくと便利かも ● PIE実行中はスクリーンショット込みで 保存される ○ コンソールコマンド BugIt [コメント]
ワールドサイズと ミニマップ ● ロード範囲を視認できない ● ビルドしてもミニマップが表示されない ● ミニマップのビルドが異常に長くなる
ワールドサイズと ミニマップ ● 天球や遠景などの行動範囲を 上回るような大きさのアクタは IsSpatiallyLoadedを外す ○ 常にロードされるように ● 一つのWPLevelの離れた位置に複数 のエリアを置いたりすると ミニマップが機能しなくなる 可能性があることに注意 ● World Settings > Enable Streaming : OFF が設定されている時も同じ状態になる ので注意
複数グリッド (SubWorldPartition)
複数グリッド (SubWorldPartition)
複数グリッド ● ● ● Runtime Partitions配列 ○ 個別のLoadingRange アクター毎にRuntimeGridを指定 ○ LevelInstanceActor 用途 ○ 街エリアは高密度、 フィールドは低密度など
Sub World Partition 5.4 それぞれのGrid設定やHLODを尊重する ランタイム生成用 のレベルインスタンス ● LevelInstanceActor ○ LevelBehavior : Standalone ● SubWP level ○ EnableStreaming : On ○ グリッド設定 ○ HLODを作成しておく スタンドアローンレベルインスタンスをレベルエディタ上に表示 wp.Editor.DisableLevelInstanceEditorPartialLoading 1 高密度セルのSubWP
Level Streaming 5.3 Persistence Plugin ワールドパーティションセル内の アクターのプロパティを保存 &復元 通常、セルがアンロードされると状態も失われる
対象プロパティは iniで設定 詳しくは次ページで シリアライズに対応 対象プロパティの任意の保存と復元 Level Streaming Persistence Plugin bool SerializeTo(TArray<uint8>& OutPayload); bool InitializeFrom(const TArray<uint8>& InPayload); 公開プロパティへの任意の設定取得 bool TrySetPropertyValue( ObjectPath, Value ); 実装詳細 ULevelStreamingPersistenceManagerを参照 参考しながらプロジェクトに則したものを自作するのもオス スメ
Level Streaming Persistence Plugin - ini 設定 ;;; DefaultEngine.ini [/Script/LevelStreamingPersistence.LevelStreamingPersistenceSettings] ; Private Properties +Properties=(Path="/Script/Engine.TextRenderComponent:Text") +Properties=(Path="/Script/Engine.TextRenderComponent:TextRenderColor") +Properties=(Path="/Game/NewFeatures/BP_TimeCounter.BP_TimeCounter_C:SummedTime") ; Public Properties (Setter/Getterでアクセス可能) +Properties=(Path="/Script/Engine.Actor:bCanBeDamaged",bIsPublic=True)
OFPA は1アクター 1ファイルで保存 アクター単位で編集ロック OFPA (One File Per Actor) の ハッシュ名 保存位置 アクターは_ExternalActors_フォルダ以下に ハッシュ名 で保存され、 コンテンツブラウザーには表示されません ! トラブル! このファイルが実際にどのアクターを指しているのかは ハッシュ名だけでは分からない
WorldPartition のおさらい WorldPartitionCell 目次 DataLayer LevelInstance HLOD
DataLayer ● レベルストリーミングに対するフィル タとして機能 ● 旧来のサブレベルワークフローでの サブレベル に近いイメージ
RuntimeDataLayer と EditorDataLayer 用途 クック時 サブレベルワークフローで 対応する機能 Runtime Data Layer ロード管理 そのまま残る Streaming method : Blueprint のサブレベル Editor Data Layer エディタ上の 編集対象のフィルタなど 省かれる Streaming method : Always Loaded のサブレベル
複数のDataLayer に割り当て
DataLayer の演算 ● 一つのアクターは複数の データレイヤーに割り当て可能 ● 属しているいずれかの データレイヤーに連動する (OR動作)
DataLayer 演算設定 5.4 ● ● WorldSettings ○ レベル毎の設定 And設定 ○ 全てのデータレイヤーが 有効になったらOn
WorldPartition のおさらい WorldPartitionCell 目次 DataLayer LevelInstance HLOD
Prefab たとえば建物単位でアクターをまとめるなどプレハブとして レベルを扱える アセットとしてはレベルを直接扱う スナップショット レベルインスタンスの入れ子構造 インライン編集 Level Instance 配置されているLevelInstanceを直接編集 Ctrl + E 分解 レベルインスタンスを任意に分解 レベルの一部を別レベルに移動する 一括設定 内部のアクターに設定を一括適用できる ● HLOD ● RuntimeGrid ● DataLayer
Level Instance の作り方
Level Instance の配置と編集モード
Level Instance への アクターの追加 アクタ エディタ コンテキスト https://docs.unrealengine.com/5.3/ja/actor-editor-context-in-unreal-engine/
Level Instance と Packed Level Actor 用途 対象 コンポーネント アセット ランタイム Level Instance 編集効率 無制限 ULevel クック時に分解されて パーシスタントレベルに埋め込 まれる Packed Level Actor 最適化 (ISM or HISM化) 制限 (StaticMeshなど) ULevelを内包したブ ループリント HISMを持った1アクターと して扱われる
Level Instance Actor Filter 5.3 バリエーション配置
Level Instance Actor Filter
Steaming Mode ● ● ランタイムで動的にレベルをロードする ○ LoadLevelInstanceと同じ動作 クック時の「埋め込み」はされない LevelInstanceActorのLevelStreamingモードと動的レベルインスタンス生成 https://qiita.com/EGJ-Takashi_Suzuki/items/91c5ff9570b583a8a0fb
Steaming Mode ● 5.4 アクターの詳細パネルで設定可能に
LevelInstance 内の アクターをプロパティとして参照 設定できない問題
EditorPath : レベルインスタンス内アクターへの参照 ;;; DefaultEngine.ini [SystemSettings] EditorPaths.Enabled=1 5.4
レベルインスタンス プロパティオーバーライド 5.5~ Forward looking @ Unreal Engine Public Roadmap https://portal.productboard.com/epicgames/1-unreal-engine-public-roadmap/tabs/94-forward-looking
WorldPartition のおさらい WorldPartitionCell 目次 DataLayer LevelInstance HLOD
HLOD
セルを一つのアクターにまとめる 不要なアセットを除き、表示に関わるコンポーネントだけを 集積して一つのアクターを作る HLOD セルストリーミングアウトで表示 セルが範囲外になると代わりに HLODActorが表示される 作成のためにビルドが必要 HLODは静的に事前にビルドする
HLODLayer ● ● LayerType IsSpatially Loaded ○ Cell Size ○ Loading Range ○ Parent Layer
HLOD LayerType の表 内容 ビルド時間 効果 Instanced セル内のメッシュをまとめて InstancedStaticMeshにする 速い 表示メッシュのみになる 複数のISMで構成 末端のLODで表示 Merged 一つのStaticMeshにまとめる 比較的速い (頂点数に依存) 1コンポーネント 合成マテリアル Simplified 一つのStaticMeshにまとめて さらにリダクション する 遅い 頂点数の削減 Approximate ボクセル化 して近似メッシュを 作成する 遅い 近似化
LayerType の見た目の比較
Instanced
Merged
Simplified
Approximate
階層HLOD ● ● Is Spatially Loaded : true ○ Cell Size / Loading Range ○ Parent Layer ■ 次のHLODLayerを指定 Far Field ○ HLOD1以降 ○ https://docs.unrealengine.com/5.3/ja/lumen-technic al-details-in-unreal-engine/#%E3%83%95%E3%82 %A1%E3%83%BC%E3%83%95%E3%82%A3%E3% 83%BC%E3%83%AB%E3%83%89
アクター毎の設定 ● ● ● ● HLOD Layer ○ 個別にHLODを設定する Include Component(Actor) in HLOD ○ HLODに含めるかどうか HLOD Batching Policy ○ Instancingを強制する Exclude from HLOD Levels ○ 特定のレベルのHLODから除外する かどうか
HLOD 作成時の消費メモリ
25600 uu grid 12800 uu grid 6400 uu grid HLOD作成時 最大消費メモリ 約40GB 約17GB 約9GB HLOD作成時間 1:54 2:05 2:43
エディタでの確認方法 ~5. 3
待望の レベルビューポートでの HLOD 確認 5.4
まとめ
静的ライティング不可 現時点では静的ライティングに非対応 5.5以降のどこかで対応予定 ListenServer モデル使用時のサーバー負荷 ワールドパーティションの 制限 サーバーは全プレイヤー分のWPセルをロードしなければ ならない セルのストリーミングの細かなコントロール データレイヤーでの管理を推奨 部分ソースコントロール同期非推奨 例えばフォルダ以下などだけをソースコントロールで同期 するなどは推奨されません 基本的にContent以下全体を全更新&全サブミット しま す
オープンワールド 広い世界をつくるならWPで! 動的ライティングだけで問題ないか確認しておく World Partition を使うべきプ ロジェクト 大規模開発 レベルを操作する開発者が多いなら OFPAはロックの競合を大幅に低減 HLOD を使いたいプロジェクト HLODはWPのセルに対して作成する
プロジェクトによる 要求するアクターの密度や移動速度、読み込み距離を念 頭に置く必要がある セルサイズが大きくなると 結局CellSize はいくつにする べき? 読み込み距離範囲外のアクターが増えメモリ使用量は増 加する傾向 ストリーミングの機会が減少 個々のストリーミング処理時間は増加 HLODビルドのメモリ消費量が増加 セルサイズが小さくなると プロモーションが起こる可能性が増加(要確認) 走査するセルの数が増大してオーバーヘッドに 調整方針 LoadingRange以下の大き目のセルサイズを設定して動 作動作確認を行い問題点がでたら小さくしていく ストリーミングプロファイル機能 LevelStreaming.Profiling.StartAutomatically 1
まとめ ● ● ● WPによって大きなワールドを効率よく作れるように ○ ストリーミング ○ HLOD ○ OFPA ○ PCG サブレベルワークフローを代替する機能 ○ DataLayer ○ LevelInstance 5.4で様々な問題が解決 ○ HLOD in Editor ○ 3D hash ○ プロモーション問題
Unreal Engine 5 早期アクセスの注目機能総おさらい Part 2【CEDEC 2021】 https://www.docswell.com/s/EpicGamesJapan/KDJ34K-UE4_CEDEC2021_UE5EA_Part2 UE5.1 アップデート ~ World Buliding/ Core ~ https://www.docswell.com/s/EpicGamesJapan/53P8EK-UE5_1_World%20Buliding_Core
https://dev.epicgames.com/community/learning/knowledge-base/r6wl/unreal-engi ne-world-building-guide
Thank you! — Epic Games Japan 2024