【UE5:検証】World Partition レベルと通常レベルのBeginPlayについて
※ 本記事は検証したことをつらつら書いただけです。
※ なにかを解決できたわけではないのでご注意下さい。
※ UE5.0.3 で検証しております。
先日、取得したアイテムをセーブ&ロードするという動画をアップロードしました。
https://www.youtube.com/watch?v=gzuJjpxYPz4
その際「World Partition を使ったレベルに対してこの方法で実装すると意図した挙動にならない」というコメントを頂きました。
更にどううまく行かなかったのか具体的な検証方法もコメント頂けました(本当にありがとうございます!)
<準備>
メニューバー「ファイル」>「新規レベル」から "Open World" を選択し WPMap(World Partition Map の略) という名前をつけました。
"Open World" で作成すると World Partition の設定や Enable Streaming が自動で有効になります。
WPMap にアイテムを5つ配置しました。
この青い箱が BP_Box という名前のアイテムを想定しています。
WPMap のレベルBP に画像の処理を記載します。
ゲームスタート時 BP_Box をすべて消すという処理です。
<検証頂いた内容>
WPMap からゲームスタートすると BP_Box はすべて削除されるが、別レベルへ移動して WPMap に戻ってくるとアイテムが削除されない。
更に World Partition を有効にしていない通常のレベルであれば問題がなかったという検証内容でした。
要するに WPMap のレベルBP が二回目以降機能しなかったということになりそうです。
このコメントを受けて私も検証させて頂きました。
分かりやすくするため画面上に削除されたアイテム数を表示しています。
WPMap からスタートすると BP_Box は全て削除されていますが、もう一度 WPMap に戻ったら確かに消えていません。
続いて次の検証してみます。
今度はデフォルトの ThirdPersonMap からスタートし、WPMap へ移動するというものですが、BP_Box は削除されていないことが分かります。
しかし WPMap のレベルBP に書いた「削除したアイテムは0個です」という表示は出ているため、レベルBP は実行されている事もわかります。
もう一つ検証してみます。
メニューバー「ファイル」>「新規レベル」から "Basic" を選択し NMMap(Normal Map の略) という名前をつけました。
"Basic" で作成すると通常のレベルになります。
World Partition との違いを確認するため用意しました。
NMMap にも同じく BP_Box を置いてあります。
レベルBP にも上記と同じ「Destroy Actor」する処理も記載してます。
NMMap からスタートすると BP_Box は削除されています。
ThirdPerson Map へ移動し、NMMap に戻ってくるという動きを何度か行ったところ、正しく削除されていることが分かります。
この内容から World Partition からスタートした場合と、別のレベルから World Partition のマップに移動した場合で挙動が違うということが分かります。
通常のレベルでは問題がなかったというのは
別レベルから通常のレベルに戻ってきても問題はなかったということになります。
マップの移動には「Open Level(by Name)」や「Open Level(by Object Reference)」を使用しています。
少し話は逸れますが World Partition にある機能の一つで Enable Streaming があります。
メニューバー「ウインドウ」>「ワールドセッティング」で確認できるプロパティです。
オープンワールドのような広大なマップを想定するとほとんどの場合、遠い場所にあるものをロードしておく必要はないため、設定した範囲外のものはロードさせないようにできる凄い機能のことです。
(余分なリソースを使わないようにできる)
次はこの Streaming に注目した検証を行いました。
先程の検証で WPMap からスタートすると BP_Box は全て削除されました。
実はこのスタートした場所は Streaming の機能でアイテムがロードされる距離でスタートしていました。
そうなると次の疑問は、Streaming の範囲外からスタートした場合はどうなのかです。
WPMap からスタートしましたが、削除されたアイテムは0個と表示されたことが確認できました。
そして少し近づくと Streaming の機能が働き BP_Box がロードされたという結果になりました。
Streaming でアンロードされている状態の BP_Box は「Get All Actors Of Class」で取得できなかったということになります。
「アウトライナ」パネルを確認すると、アンロードではレベル上に存在せず、ロード状態で初めて表示(インスタンス化されてる?)ような挙動をしています。
アクタ個別の「詳細」パネル> ワールドパーティションという項目に "Is Spatially Loaded" の設定があり、チェックを外すと一応この問題は解決されます。
"Is Spatially Loaded" にマウスオーバーするとこのような表記が出ます。
True の場合は Streaming の範囲内であることも条件に含まれていることが分かります。
チェックを外すと Streaming の範囲外でもロードするという設定になるため、数が多かったりロードする容量が多いと場合によっては微妙かもしれません。
※注)ここから先は検証方法があってるのか分からないので頓珍漢なことを言ってる可能性があります。
ポップアップには (1)DataLayer にないこと、(2)複数の DataLayer が有効になっている場合ということも条件に含まれています。
DataLayer とは、例えばレベル上に配置したアクタをレイヤー分けし、ロードやアンロードを好きなタイミングで実行することができるこれまた凄い機能のことです。
お絵かきソフトにあるレイヤーと同じような扱いと考えると分かりやすいかもしれません。
例えば、同じ街でも物語の序盤と中盤で見た目が変わるような作りにすることができます。
1つ目のレイヤーに綺麗な街並みを、2つ目のレイヤーに荒廃した街並みと分けることでロードすべき DataLayer を好きなように切り替えれます。
しかも DataLayer は実行時(ランタイム)以外にも
エディタ操作の設定も扱うことができるのでとてもいい機能だと思います。
5つ全ての BP_Box に "Is Spatially Loaded" を OFF(False) に設定しました。
まず「(1)DataLayer にない」というのは DataLayer に追加されていないことを指しているのかなと思い次の画像の設定をしてみました。
BlueCube という名前の DataLayer を新規作成し、5つの BP_Box を入れてみました。
BlueCube DataLayer の "Is Runtime" はとりあえず OFF にしました。
これでゲームスタートすると BP_Box はすべて削除されました。
「(1)DataLayer にない」というのがよく分からなくなりました。
"Is Runtime" の結果で変わるのかなと思いそれぞれで実行しました。
"Unloaded":削除されず
"Loaded":削除されず
"Activated":全て削除
う~ん...普通の結果だと思います。
次の検証です。
BlueCube2 という名前の DataLayer を新規作成し、3つの BP_Box を入れてみました。
BlueCube2 の "Is Runtime" にチェックを入れて同じように確認。
"Unloaded":削除されず
"Loaded":削除されず
"Activated":3つ削除
う~ん......?これも普通の結果だと思います。
ポップアップの説明を正しく理解できていないか、検証の仕方が悪いんだと思いますが、私のスキルでは今の所これが限界でした。
そんな訳で World Partition と通常のレベルが違う扱いになっていることがよく分かりました。
おまけで DataLayer も検証しましたが分からないことが増えただけでしたw
UE5 本当に難しいですね...できることが多く機能もかなりあるので四苦八苦しております;
可能であれば "Is Spatially Loaded" を ON にした状態でもアクタの数を取得できる方法があれば World Partition のメリットを更に利用できるのになあ...と思いました。
是非またチャレンジしたい内容なので
情報が集まったら動画なりで紹介してみようと思います。