WorldPartition2024

70.6K Views

March 05, 24

スライド概要

Unreal Engine 5で導入された広大なワールドを作成するための機能であるWorldPartitionのこれまでとこれからを解説いたします。
Unreal Engine Meetup Connect - ゲーム開発編 - Vol.1 の中での講演資料になります。

アーカイブ動画:
https://www.youtube.com/live/nzKB5sCBCnk?si=ujPx55_yqWyLhjZC

イベントページ:
https://leon-gameworks.connpass.com/event/305752/

profile-image

Unreal Engineを開発・提供しているエピック ゲームズ ジャパンによる公式アカウントです。 勉強会や配信などで行った講演資料を公開しています。 公式サイトはこちら https://www.unrealengine.com/ja/

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

関連スライド

各ページのテキスト
1.

World Partition 2024 Senior Software Engineer, Developer Relations Takashi Suzuki 2024 Epic Games Japan

2.

アンケート: ワールドパーティションははじめて?

3.

アンケート: ワールドパーティションははじめて? そうだよ! ちがうよ! 初耳だよ! 名前は聞いたことある 様子見してる! プロだよ! まだ慌てる時間じゃない 使ってるよ!

4.

WorldPartitionのおさらい WorldPartitionCell 目次 DataLayer LevelInstance HLOD

5.

WorldPartitionのおさらい WorldPartitionCell 目次 DataLayer LevelInstance HLOD

6.

単一レベル構成 パーシスタントレベル

7.

サブレベルワークフロー パーシスタントレベル 背景サブレベル 敵セットアップサブレベル VFX&ライトサブレベル

8.

サブレベルワークフロー パーシスタントレベル ス ミン ー トリ グ

9.

オープンワールド パーシスタントレベル

10.

そこでワールドパーティションの登場 ワールドの自動分割 同時編集 シームレスな体験 広大なワールドを自動的に分割 多くの開発者が同時に編集 ストリーミングでメモリを 有効活用

11.

Data Layer Level Instance ワールドパーティション のツール群 World Partition OFPA PCG HLOD

12.

Data Layer ワールドパーティション Level Instance ● ● ● ワールド分割機能 エディタ上では単一のレベル PIE開始時/クック時に分割し ストリーミングレベルに変換 ○ セルと呼ばれる World Partition OFPA PCG HLOD

13.

Data Layer Level Instance データレイヤー World Partition ● ● OFPA エディタ上でのフィルタ 条件付ストリーミング PCG HLOD

14.

Data Layer HLOD ● ● ● 遠景の解決 自動で入れ替え 最適化メッシュの自動作成 Level Instance World Partition OFPA PCG HLOD

15.

Data Layer Level Instance レベルインスタンス World Partition ● ● OFPA 編集の効率化 再利用性 PCG HLOD

16.

Data Layer One file per actor ● ● ● レベルの同時編集 1アクターに1ファイル 別名 ExternalActors Level Instance World Partition OFPA PCG HLOD

17.

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

18.

WorldPartitionのおさらい WorldPartitionCell 目次 DataLayer LevelInstance HLOD

19.

ワールドパーティション 対応レベルの作り方 ● ● テンプレートから作成 コマンドレットから変換 ○ WP -> 非WP は不可

20.

ワールドパーティション 対応レベル? ● ● WorldPartitionEditorWindow UWorld内にUWorldPartitionオブ ジェクトがあるかどうか

21.

ワールド分割 ● 2Dセル ● アクター振り分け ○ ● スライスされるわけではない 距離ベースのストリーミング

22.

範囲内のセルを 自動的にストリーミング HLOD(遠景描画)の非表示 wp.Runtime.HLOD 0

23.

分割設定設定 ● World Settings > Runtime Settings > Grids ○ Cell Size ○ Loading Range ○ Priority

24.

WorldPartitionStreamingSource ● ● 追加のロード範囲設定 ファストトラベルなどの実現 Cellの状態を2Dオーバーレイ表示 wp.Runtime.ToggleDrawRuntimeHash2D

25.

WorldPartitionStreamingSource ● コンポーネントをアクターに追加

26.

PlayerControllerも ストリーミングソース ● ● ● Enable Streaming Source ○ ストリーミングソースとして扱うか Radius / Loading Range Scale ○ 動的なローディング距離指定など 角度指定 ○ 後方はロードしない設定など

27.

ロードが終わっていることを 判定するには?

28.

グリッドレベルと プロモーション

29.

グリッドレベルと プロモーション

30.

● ● ● グリッドレベル ○ 段階的に拡大するセル プロモーション ○ どのセルにも割り当てられなかった アクターをより上位のグリッドレベル に割り当てること なにがおこるか ○ 一部のアクターがなかなかストリー ムアウトしない ○ 巨大なHLOD(遠景メッシュ)をビルド してしまう

31.

グリッドレベルと プロモーション || | | | [+] || | | | [+] [+] [+] [+] [+] 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

32.

グリッド分割設定 ~5.2 CVarによる設定 【注意】 UseAlignedGridLevels=true PlaceSmallActorsUsingLocation=fasle が設定されていると アクターがどのセルにも入らない問題 が出やすくなります。 wp.Runtime.RuntimeSpatialHashUseAlignedGridLevels=false wp.Runtime.RuntimeSpatialHashSnapNonAlignedGridLevelsToLowerLevels=false wp.Runtime.RuntimeSpatialHashPlaceSmallActorsUsingLocation=true wp.Runtime.RuntimeSpatialHashPlacePartitionActorsUsingLocation=true

33.

グリッド分割設定 WorldSettings内設定 5.3~

34.

カスタムハッシュと 3Dハッシュ 5.4

35.

ミニマップ ● World Partition Editor ウィンドウ ● 矩形選択した範囲をロード ● 次回起動時にロード範囲を復元

36.

ミニマップLocationVolume ● Convert Selected Region(s) To Actor(s) で作成する ● 選択範囲をアクター化 ○ ● チームで共有できる ミニマップに常に表示される

37.

BugIt ● カメラの位置をクリップボードに出力 ● コンソールコマンドとして実行するカメ ラを移動し、周辺を自動でロードする ● Wikiなどに纏めておくと便利かも ● PIE実行中はスクリーンショット込みで 保存される ○ コンソールコマンド BugIt [コメント]

38.

ワールドサイズと ミニマップ ● ロード範囲を視認できない ● ビルドしてもミニマップが表示されない ● ミニマップのビルドが異常に長くなる

39.

ワールドサイズと ミニマップ ● 天球や遠景などの行動範囲を 上回るような大きさのアクタは IsSpatiallyLoadedを外す ○ 常にロードされるように ● 一つのWPLevelの離れた位置に複数 のエリアを置いたりすると ミニマップが機能しなくなる 可能性があることに注意 ● World Settings > Enable Streaming : OFF が設定されている時も同じ状態になる ので注意

40.

複数グリッド (SubWorldPartition)

41.

複数グリッド (SubWorldPartition)

42.

複数グリッド (SubWorldPartition) ● ● ● Runtime Partitions配列 ○ 個別のLoadingRange アクター毎にRuntimeGridを指定 ○ LevelInstanceActor 用途 ○ 街エリアは高密度、 フィールドは低密度など

43.

Level Streaming 5.3 Persistence Plugin ワールドパーティションセル内の アクターのプロパティを保存 &復元 通常、セルがアンロードされると状態も失われる

45.

対象プロパティは iniで設定 詳しくは次ページで シリアライズに対応 対象プロパティの任意の保存と復元 Level Streaming Persistence Plugin bool SerializeTo(TArray<uint8>& OutPayload); bool InitializeFrom(const TArray<uint8>& InPayload); 公開プロパティへの任意の設定取得 bool TrySetPropertyValue( ObjectPath, Value ); 実装詳細 →ULevelStreamingPersistenceManagerを参照 参考しながらプロジェクトに則したものを自作するのもオス スメ

46.

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)

47.

OFPAは1アクター1ファイルで保存 アクター単位で編集ロック OFPA(One File Per Actor) の ハッシュ名 保存位置 アクターは_ExternalActors_フォルダ以下に ハッシュ名で保存され、 コンテンツブラウザーには表示されません !トラブル! このファイルが実際にどのアクターを指しているのかは ハッシュ名だけでは分からない

50.

WorldPartitionのおさらい WorldPartitionCell 目次 DataLayer LevelInstance HLOD

51.

DataLayer ● レベルストリーミングに対するフィル タとして機能 ● 旧来のサブレベルワークフローでの サブレベルに近いイメージ

52.

RuntimeDataLayer と EditorDataLayer 用途 クック時 サブレベルワークフローで 対応する機能 Runtime Data Layer ロード管理 そのまま残る Streaming method : Blueprint のサブレベル Editor Data Layer エディタ上の 編集対象のフィルタなど 省かれる Streaming method : Always Loaded のサブレベル

53.

複数のDataLayerに割り当て

54.

DataLayerの演算 ● 一つのアクターは複数の データレイヤーに割り当て可能 ● 属しているいずれかの データレイヤーに連動する (OR動作)

55.

DataLayer演算設定 5.4 ● ● WorldSettings ○ レベル毎の設定 And設定 ○ 全てのデータレイヤーが 有効になったらOn

56.

WorldPartitionのおさらい WorldPartitionCell 目次 DataLayer LevelInstance HLOD

57.

Prefab たとえば建物単位でアクターをまとめるなどプレハブとして レベルを扱える アセットとしてはレベルを直接扱う スナップショット レベルインスタンスの入れ子構造 インライン編集 Level Instance 配置されているLevelInstanceを直接編集 Ctrl + E 分解 レベルインスタンスを任意に分解 レベルの一部を別レベルに移動する 一括設定 内部のアクターに設定を一括適用できる ● HLOD ● RuntimeGrid ● DataLayer

58.

Level Instance の作り方

59.

Level Instance の配置と編集モード

60.

Level Instance への アクターの追加 アクタ エディタ コンテキスト https://docs.unrealengine.com/5.3/ja/actor-editor-context-in-unreal-engine/

61.

Level Instance と Packed Level Actor 用途 対象 コンポーネント アセット ランタイム Level Instance 編集効率 無制限 ULevel クック時に分解されて パーシスタントレベルに埋め込ま れる Packed Level Actor 最適化 (ISM or HISM化) 制限 (StaticMeshなど) ULevelを内包したブ ループリント HISMを持った1アクターと して扱われる

62.

Level Instance Actor Filter 5.3 バリエーション配置

63.

Level Instance Actor Filter

66.

Steaming Mode ● ● ランタイムで動的にレベルをロードする ○ LoadLevelInstanceと同じ動作 クック時の「埋め込み」はされない LevelInstanceActorのLevelStreamingモードと動的レベルインスタンス生成 https://qiita.com/EGJ-Takashi_Suzuki/items/91c5ff9570b583a8a0fb

67.

Steaming Mode ● 5.4 アクターの詳細パネルで設定可能に

68.

LevelInstance内の アクターをプロパティとして参照 設定できない問題

69.

EditorPath : レベルインスタンス内アクターへの参照 ;;; DefaultEngine.ini [SystemSettings] EditorPaths.Enabled=1 5.4

70.

レベルインスタンス プロパティオーバーライド 5.5~ Forward looking @ Unreal Engine Public Roadmap https://portal.productboard.com/epicgames/1-unreal-engine-public-roadmap/tabs/94-forward-looking

71.

WorldPartitionのおさらい WorldPartitionCell 目次 DataLayer LevelInstance HLOD

72.

HLOD

73.

セルを一つのアクターにまとめる 不要なアセットを除き、表示に関わるコンポーネントだけを 集積して一つのアクターを作る HLOD セルストリーミングアウトで表示 セルが範囲外になると代わりに HLODActorが表示される 作成のためにビルドが必要 HLODは静的に事前にビルドする

74.

HLODLayer ● ● LayerType IsSpatially Loaded ○ Cell Size ○ Loading Range ○ Parent Layer

75.

HLOD LayerTypeの表 内容 ビルド時間 効果 Instanced セル内のメッシュをまとめて InstancedStaticMeshにする 速い 表示メッシュのみになる 複数のISMで構成 末端のLODで表示 Merged 一つのStaticMeshにまとめる 比較的速い (頂点数に依存) 1コンポーネント 合成マテリアル Simplified 一つのStaticMeshにまとめて さらにリダクションする 遅い 頂点数の削減 Approximate ボクセル化して近似メッシュを 作成する 遅い 近似化

76.

LayerTypeの見た目の比較

77.

Instanced

78.

Merged

79.

Simplified

80.

Approximate

81.

階層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

82.

アクター毎の設定 ● ● ● ● HLOD Layer ○ 個別にHLODを設定する Include Component(Actor) in HLOD ○ HLODに含めるかどうか HLOD Batching Policy ○ Instancingを強制する Exclude from HLOD Levels ○ 特定のレベルのHLODから除外する かどうか

83.

HLOD作成時の消費メモリ

84.

25600 uu grid 12800 uu grid 6400 uu grid HLOD作成時 最大消費メモリ 約40GB 約17GB 約9GB HLOD作成時間 1:54 2:05 2:43

85.

エディタでの確認方法 ~5.3

86.

待望の レベルビューポートでのHLOD確認 5.4

87.

まとめ

88.

静的ライティング不可 現時点では静的ライティングに非対応 5.5以降のどこかで対応予定 ListenServerモデル使用時のサーバー負荷 ワールドパーティションの 制限 サーバーは全プレイヤー分のWPセルをロードしなければ ならない セルのストリーミングの細かなコントロール データレイヤーでの管理を推奨 部分ソースコントロール同期非推奨 例えばフォルダ以下などだけをソースコントロールで同期 するなどは推奨されません 基本的にContent以下全体を全更新&全サブミットしま す

89.

オープンワールド 広い世界をつくるならWPで! 動的ライティングだけで問題ないか確認しておく World Partitionを使うべきプ ロジェクト 大規模開発 レベルを操作する開発者が多いなら OFPAはロックの競合を大幅に低減 HLODを使いたいプロジェクト HLODはWPのセルに対して作成する

90.

プロジェクトによる 要求するアクターの密度や移動速度、読み込み距離を念 頭に置く必要がある セルサイズが大きくなると 結局CellSizeはいくつにするべ き? 読み込み距離範囲外のアクターが増えメモリ使用量は増 加する傾向 ストリーミングの機会が減少 個々のストリーミング処理時間は増加 HLODビルドのメモリ消費量が増加 セルサイズが小さくなると プロモーションが起こる可能性が増加(要確認) 走査するセルの数が増大してオーバーヘッドに 調整方針 LoadingRange以下の大き目のセルサイズを設定して動 作動作確認を行い問題点がでたら小さくしていく ストリーミングプロファイル機能 LevelStreaming.Profiling.StartAutomatically 1

91.

まとめ ● ● ● WPによって大きなワールドを効率よく作れるように ○ ストリーミング ○ HLOD ○ OFPA ○ PCG サブレベルワークフローを代替する機能 ○ DataLayer ○ LevelInstance 5.4で様々な問題が解決 ○ HLOD in Editor ○ 3D hash ○ プロモーション問題

92.

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

93.

https://udn.unrealengine.com/s/article/World-Building-Guide?language=en_US 要

94.

Thank you! — Epic Games Japan 2024