投稿記事

検証の記事 (3)

わんころのUE5勉強会 2024/07/25 22:02

【UE5】レベルシーケンサの再生と逆再生をBlueprintで制御する検証

皆様、こんばんは!

以前、レベルシーケンサの再生や逆再生など、再生周りの操作を Blueprint を使って遊んでた時のプロジェクトを改めて起動し、機能追加とかしてみようと思ってたのですが、個人的によく分からない部分もあったため備忘録として残しておきます。

やることはレベルシーケンサにアニメーションシーケンスを入れて再生などしたものです。

本記事はただの検証とその結果を書いた記事なので、いつも以上によく分からないことが沢山書かれているので注意して下さい!

UE 5.1.1 で作成してます。


適当なレベルシーケンスを用意


シーケンサの作成が本題ではないので詳しい内容は割愛しますが、 MF_Run_Fwd(走りアニメ) を使って左から右に移動させるものを作成してます。

再生をコントロールする UI を作成


コンテンツブラウザで右クリック> ユーザーインターフェース> ウィジェットブループリント と選択し WBP_Sequence というものを作成しました。

UI の構成はこんな感じにしています。
ボタンの見た目や名前と内部の処理が一致してませんが、各UIの役割は以下の通りです。

Stop(Button):押すと一時停止します。

Play(Button):押すと再生します。一時停止中の場合、その場から再生を再開します。

PlayBack(Button):押すと逆再生します

PlayForward(Button):押すと通常再生に戻します(機能は Play と同じですが、実装に使った関数が違い、挙動の違いが確認出来ました。後述しています。)

Seekbar(Slider):スライダを動かすことでスクラブ(再生位置を調整)する機能です。


レベルシーケンスを変数にして使いやすくする


WBP_Sequence のグラフで右クリックし「On Initialized」を出し、「Set Input Mode UI Only」+「Set Show Mouse Cursor」で UI 専用の操作にしてみました。

※ 今回の例だと「On Initialized」ではなく「Construct」でも同じですが、初期化の処理は1回実行されればいいので「On Initialized」を利用しました。

更に「Create Level Sequence Player」の Return Value から変数へ昇格し、以降シーケンサのあれこれはこの変数を利用します。
(最初スクラブのテストをしていたので変数名は Scrub Sequence としています)



「On Initialized」の続きの部分です。

先程変数へ昇格した Scrub Sequence から引っ張り「Get End Time」を出します。この Return Value は "Qualified Frame Time 構造体" になっており、構造体を分割をすると表示される Value(Integer型)でシーケンサの最終フレーム(時間?)を取得できます。
これも変数に昇格し "End Frame" という名前にしました。

最後に Seekbar から引っ張り「Set Max Value」の "In Value" ピンに「Get End Time」で取得した値を渡し、スライダの最大値をシーケンサの最終フレームと同じにします。


"End Frame" に入る具体的な値ですが、この例だと 72 になります。


そしてレベルブループリントで「Create Widget」から「Add to Viewport」し、開始時にシーケンサを再生する冒頭の動画の挙動ができます。後は UI の操作と連動する部分を作成していきます。

再生・一時停止



再生は「Play」、一時停止は「Pause」を利用するだけなので簡単です。「Stop」という関数もありますが、これは停止後に「Play」すると最初から再生されるので挙動が違います。

また、シーケンサが最後まで再生された後にもう一度「Play」を呼ぶと最初から再生になります。


余談ですが、再生ボタンをクリックすると一時停止のアイコンに変わり、もう一回クリックすると再生のアイコンに変わるような、1ボタンで「Play」⇋「Pause」を切り替えれる UI がいいかなと思いました。


逆再生・順再生



逆再生は「Play Reverse」という関数が用意されており、呼ぶと現在の再生位置から逆再生が始まります。

順再生は普通の再生と同じく「Play」を呼んでいるため、現在の再生位置から普通に再生を再開しているという挙動です。

気になる点がありまして、この動画の5秒あたりで「Play Reverse」を呼んでシーケンサの最初に戻った所に注目すると、開始位置に戻っているのにピタッと止まってないことに気づきました(少し長めにアニメーションが再生されている)

また、順再生の方も同じくシーケンサの最後まで再生された時にピタッと止まってませんでした。

理由はよく分からないが原因は分かった


MF_Run_Fwd の0フレーム目(開始時)に Anim Notify を仕込み、アニメーションが開始した瞬間が分かるようにしました。

なぜそういう挙動になっているのかは分かりませんでしたが「Play Reverse」でシーケンサの最初に戻った時に MF_Run_Fwd(走りアニメ)が再生されていたのが原因でした。

画像にはないですが、同じ手法で MF_Run_Fwd 終了時にも Anim Notify を仕込んでシーケンサを最後まで再生させると同じくアニメーションが再生され続け、その終わりで Anim Notify が実行されました(シーケンサの終了より少し遅れて Anim Notify が実行された)

細かい所ですが仕様的にそういうもんじゃないか...という気持ちを抑え、どうにかシーケンサと連動してアニメーションがピタッと止めれないかと色々確認してみました。


検証1:When Finished で挙動が変わる


この挙動ですが、レベルシーケンス上に追加したアニメーションを右クリック> セクションの編集> When Finished を "Keep State" にしているとこうなるようでした。

これはシーケンサの再生が終わった時に固定したいものがある時に利用するプロパティです。例えばドアを開けるカットシーンがあった時に、ドアを開きっぱなしにしておくなどが出来ます。

"Keep State" を "Restore State" に変更した時の挙動がこちらです。

ピタッと止まりましたが Idle になりました。走りアニメーション中に止まって欲しかったので想定してた結果にはなりませんでした。

"Restore State" は再生する前の状態に戻ります。
ドアの例だと、シーケンサの再生が終わったらドアが閉まった状態に戻ります。

検証2:「Play To」を使って解決


※上記の「Play Reverse」「Play」を「Play To」に置き換えた画像


※元の「Movie Scene Sequence Playback Params を作成」

When Finished を "Keep State" にしている挙動の方が理想だったので "Keep State" のままで何か出来ないかも確認していると「Play To」を使うことで解決出来ました。

「Play To」の "Playback Params" 入力ピンから引っ張り、「Movie Scene Sequence Playback Params を作成」を出して構造体ピンを分割した状態の画像です。

「Movie Scene Sequence Playback Params を作成」の "Position Type" が [Frame] の場合、Frame Number の Value の値を利用するようです。


この数値はレベルシーケンサ上のフレームと同じ扱いのようです。
UI の逆再生ボタンを押すと「Play To」で現在の再生位置から 0フレームへ向けて再生されるので実質逆再生になります。

順再生ボタンを押すと、今回 End Time が 72 のシーケンサなので、現在の再生位置から72フレームへ向けて再生されるので順再生になりますが、「Play」と違い 72フレーム目に来た時ピタッと止まります。

▼ それがこの動画です

動画の最後に、逆再生後に普通の再生(「Play」を呼ぶ)ボタンを押した時は最後がピタッと止まってないことが確認できます。


検証結果:「Play」「PlayTo」


なにかの設定等で回避出来たのかもしれませんが、とりあえず今回の検証で分かったことは、再生するアニメーションを Keep State にして「Play」でシーケンサの最後まで再生した場合そのアニメーションの1サイクルが終わってないとそのまま再生され続けることが分かりました。

「Play Reverse」で逆再生した時、0フレームに戻ったタイミングでそのアニメーションを再度再生して止まるという結果になりました。


アニメーションの1サイクルとは画像で示したシーケンサ上の「|」こんなアイコンの所です。今回のシーケンサでは2サイクル目のアニメーションが再生されますが、2サイクル目が終わる前にシーケンサが終了してしまうため、残りのアニメーション終了まで再生されたということだと思います。

「Play」と「PlayTo」で何か処理が違うんですかね...
今まで「Play」「Stop」「Pause」くらいしか使ったことなかったので色々知れて勉強になりました。


スライダを使ったスクラブで再生位置を調整


こんな感じでスライダを使って再生位置を変更できます。
再生中のスライダが連動して動いていませんが、シーケンサの現在の再生位置を取得し続けるような仕組みをどう実装すればいいか分からなかったため今回は未実装になりました。

後述する「Set Playback Position」を WBP_Sequence の Tick で使えばそれっぽい挙動は出来たのですが、一時停止中などシーケンサを止めている場合でも常に実行され続けるため余分な処理が続くな...と思いました。



完成した Blueprint を先に貼っておきます。
先程スライダ(変数Seekbar)の「Set Max Value」を End Time である 72 に設定したのでスライダの値は 0~72 の間になっています。

スライダの値をそのままシーケンサのフレームへセットすることで実現できます。


「On Value Changed」はスライダの値が変更される度に呼ばれます。スライダを左右に動かしている間も値が変わるので呼ばれます。

Scrub Sequence から引っ張り「Set Playback Position」を出します。これがシーケンサの再生位置を直接変更できる関数のようです。

これも構造体ピンを分割していき、Frame Number の Value に「On Value Changed」で変更された値 Value を繋ぎます(Float から Integer への変更のため、切り捨ての Truncate が使用されています)

「Play To」の時も出てきましたが、"Position Type" が [Frame] の場合、Frame Number の Value の値を利用するようです。


「On Mouse Capture Begin」はスライダ上をクリックした時に1度呼ばれます。そのままスライダを動かしている間は呼ばれません。
こちらはスライダをクリックした時に「Is Playing」でシーケンサが再生されているかチェックし、再生中であれば「Pause」を使って一時停止させています。

「On Mouse Capture Begin」の方が先に処理されますが、スライダ上をクリックした = 値が変わったという事でもあるのでその後「On Value Changed」も処理されます。

スライダの値を再生位置の指定にそのまま使えるので処理自体は結構簡単ですね。

おわりに

この検証ですがネットで調べても全然情報がなく色々なノードや設定を変更してこういうことなのかな...というのが分かったのですが個人的にかなり苦戦してました。

例えば「Get End Time」で取得した 72 という数値。これは記事にあったシーケンサの最終フレームを取得出来ます。

しかし「Play To」や「Set Playback Position」で値をセットしたのは Frame の Value が使われています。取得は Time でセットが Frame だったので混乱してました。

そして "Position Type" の [Frame] で、[Time] を選ぶこともできるんですが、その場合は Time の値が利用されます。Frame の Value に何を指定していても関係なくこれも混乱していた原因の一つです。

しかも構造体ピンを分割とかしないと見つけられないこともあり、最初これを何に使うのか?むしろ使わない?ということも含め全然わかりませんでした...

そしてシーケンサの0フレーム・最終フレームへ到達した時のアニメーションがピタッと止まらない等々、分からないことが続いていたとは言えかなり勉強になりました。

場合によっては「Play To」での再生もいいかもしれないなということで今回は終わりにします。


それではまた!

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

わんころのUE5勉強会 2023/01/01 00:00

【UE5:検証】Enhanced Input:Priority や Consume Input

皆様、あけましておめでとうございます!!
今年も一年宜しくお願い致します!

2022年で一番触ったはずの Enhanced Input が未だによく分かっていません。
すべての始まりである「Add Mapping Context」も初心者の私にはややこしかったため、色々確認したことをまとめた記事になります。

【この記事の内容を YouTube の動画で公開】
https://youtu.be/j8pUpNu8CuE


「Input Mapping Context」を記載するのが長いので、以降 IMC と記載しています。

Add Mapping Context


Enhanced Input を触った時に一番最初にお世話になるノードだと思います。

機能としては "Mapping Context" で指定した IMC を追加し、入力を使えるように準備します。

"Priority" で入力の優先度をつけることができます。
数字の大きい方が優先度が高くなります。


2023-01-02 追記:
"Options" ですが、とても重要なオプションであることが分かったため追記致しました。
どういうオプションなのかについてページ下部の「Ignore All Pressed Keys Until Release」に追記しております。


抑えておくメインの機能についてはたったこれだけです。
これだけなんですが、どういう挙動を示すのかを見ていくと意外とややこしいです。

しかも Enhanced Input を使う上で絶対理解した方がいい挙動ばかりでした。


▼ Enhanced Input の公式ドキュメント
https://docs.unrealengine.com/5.0/ja/enhanced-input-in-unreal-engine/

公式ドキュメントにこのような記載がされています。

適用したコンテキストに優先順位を付けることで、同じ入力を受け取る複数のアクション間の競合を解決できます。

複数の IMC があり、それぞれで IA_Jump という同じ入力アクションを設定した場合、ジャンプボタンを押した時にトリガーされるのは1回なのか、複数回なのか気になりますよね。

この記事はその優先順位に注目しています。
そんなわけで下記いくつか検証を行ってみました。

検証の前に

今回の検証ではジャンプのトリガーを基準に見てみます。


まず IMC_A と IMC_B の2つを用意し、両方に入力アクションの「IA_Jump:スペースバー」を割り当てています。

IMC_A は Triggers に Pressed を指定しています。
(Pressed はキーを押した瞬間トリガーされます)

IMC_B は Triggers に Released を指定しています。
(Released はキーを離した瞬間トリガーされます)

また、入力アクション IA_Jump には Triggers/Modifiers は設定していませんが、大事な設定なので "Consume Input" に赤枠をつけています。
最初は ON の状態で確認します。



トリガーの確認方法ですが、ジャンプがトリガーされた時「Print String」で "Jump" と出力するようにしました。

押した離したでどうなるか見ていきます。

検証1:IMC_A の優先度を高くする


「Add Mapping Context」の Priority を IMC_A が高くなるようにしました。

プレイして確認すると IMC_A の Pressed 入力が優先され、スペースバーを押した瞬間に1回トリガーされます。

IMC_B の Released はトリガーされません。


検証2:IMC_B の優先度を高くする


今度は IMC_B の Priority が高くなるようにしました。

プレイして確認すると IMC_B の Released 入力が優先され、スペースバーを離した瞬間に1回トリガーされます。

IMC_A の Pressed はトリガーされません。


検証3:同じ Priority にする


今度は両方の Priority を同じにしました。

プレイして確認すると後で追加された IMC_B の Released 入力が優先されスペースバーを離した瞬間に1回トリガーされます。

IMC_A の Pressed はトリガーされません。
同じ Priority の場合は後から追加したものが優先されます。


ここまでの結果で、入力が被った場合は Priority の高い方が優先され、同じ場合は「Add Mapping Context」で後から追加したものが優先された入力になることが分かりました。


検証4:割り当てるキーが違う場合


今度は IMC_B のスペースバーの代わりにマウスの右クリックを割り当てました。

入力の被りがなくなった場合はどう処理されるかも見てみます。
結果は Priority に関係なく両方ともトリガーの対象になります。

IMC_A のスペースバー(Pressed)と、IMC_B の右クリック(Released)が両方とも利用できるということです。

同じ IA_Jump を使ってるので Priority の高い方が優先されるのかなと思いましたが、キー入力も完全に一致してる時じゃないと効果はないようですね。


この設定をちぐはぐにしておくメリットがあるのか分かりませんが、入力があっちもこっちも反応してる場合はこの辺りを見直したほうが良いかもしれません。

検証5:Consume Input とは?

※ IMC_A と IMC_B 両方ともスペースバーの入力に戻しました


ここまでの検証は "Consume Input" が ON でした。
OFF にするとどういう挙動になるかも見ていきます。

結果は Priority に関係なく両方ともトリガーの対象になります。

入力はどちらもスペースバーですが、押した瞬間、離した瞬間それぞれでトリガーされるということです。

"Consume Input" は入力が被ったキーがあった場合、優先度が低い入力も処理するか?という設定になることがわかりました。

2023-01-03 追記:検証6:複数の IMC で入力アクションは異なるが同じキーを割り当てた場合


今度は IMC_B に違う入力アクション IA_Jump2 を割り当て、キーはスペースバーで同じキーを割り当てました。

入力イベントは異なっているが、割り当てたキーは同じというシチュエーションです。

この結果は Priority の高い方が優先されます。
それぞれの入力イベントでトリガーされるだろうと思っていたので意外でした。

検証の結果

ここまでの結果で、Enhanced Input の入力は、入力アクション(IA_○○)よりも割り当てたキーが被っているかどうかを優先的に判断し、その結果を Priority や Consume Input に準じて処理するという結果になっています。

入力が競合しないようにと、簡単に書いてましたが、
細かい挙動はドキュメントを見ただけでは分からない内容ばかりでした。



ただ追加するだけですが、設定によって色々なパターンがあることが知れて非常に勉強になりました。


IMC はキャラ移動用や UI 操作用など、ゲーム内で必要な新しい入力を追加することができるので、優先度について知っておくことは今後必要になると思います。


おまけ1:Remove Mapping Context


"Mapping Context" で指定した IMC を削除します。
IMC がなかった場合はエラーや警告もなさそうでした。

主に「Add Mapping Context」で追加した IMC を削除する時に利用することになると思います。

一例ですが、インベントリを開いた時に 「Add Mapping Context」で UI用の入力を追加し、閉じる時に「Remove Mapping Context」で削除するような使い方が出来ます。

IMC がアセット単位のためこういう付け替えが容易にできるのは非常に嬉しい機能です。


おまけ2:Clear All Mappings


追加したすべての IMC を削除できます。

ゲーム中タイトル画面に戻ることを想定した時、色々な IMC が追加されていることも予想されるため「Clear All Mappings」で綺麗にしてから必要な IMC だけ「Add Mapping Context」をするなどの初期化系の処理に使えそうです。

2023-01-02 追記:"Options"ピンの Ignore All Pressed Keys Until Release

先に Twitter へのリンクを貼っておきます。
https://twitter.com/UE5wancoro/status/1609488690421837825

どういうシチュエーションなのかというと
IMC_A に IA_OpenPauseMenu という入力アクションを用意し、Escキー(Pressed)で Pauseメニューを開くという実装をしました。

Pauseメニューを開く際、Pauseメニュー専用の IMC_Pause を「Add Mapping Context」で追加します。

IMC_Pause には、IA_ClosePauseMenu という入力アクションを用意し、同じく Escキー(Pressed)で Pauseメニューを閉じるという実装しました。

Pauseメニューを閉じる際、IMC_Pause を「Remove Mapping Context」で削除します。


こういうシチュエーションで、IMC も入力アクションも Open/Close で違うけど、両方同じキーを割り当てたという内容です。

Escキーで Pauseメニューを開くと、なんとメニューが開く→ 閉じる→ 開く...と Escキーを押しっぱなしの間これがループします。

「Add Mapping Context」で違う IMC を追加したにも関わらず、入力アクション(入力イベント)も違うのに、入力はフラッシュされず押した状態が継続しているということになり普通にまずい挙動です。

期待していた動作は Escキーを押せばメニューがちゃんと開き、もう一回押したら閉じるという動作です。


その前に、この動作については historia 様が公開して下さっているこの記事で解決できます!
本当にありがとうございます!!

▼ [UE5][C++]EnhancedInputで独自のInputTriggerを作る~UIカーソル高速移動編~
https://historia.co.jp/archives/26608/




補足となりますが「Add Mapping Context」「Remove Mapping Context」の "Options" は「Modify Context Options 構造体」となっていて、画像のようにピンを分割することができます。


右側のようにピンを分割するか、「ModifyContextOptionsを作成」ノードを使うと出てくる "Ignore All Pressed Keys Until Release" のフラグにチェックを入れれば先程のメニューが開いて閉じてのループはなくなります。

注意したい点は "Options" ピンが結合されている状態だと先程のループする症状が発生するということです。

"Options" ピンを分割するとデフォルトでチェックが入っておりループはしません。

恐らくデフォルトで "Ignore All Pressed Keys Until Release" が False になっていると思われるので、明示的に True にしておく必要があるようです。

今まで使った事がなかった "Options" ですがこんな大事な設定が隠れているなんて思いませんでした。
これを知らずにデバッグしても解決策は見つからなかったと思いました。


押しっぱなしで反応してもいいケースや、そういう挙動にならないケースであれば False でいいと思いますが、これからは「Add Mapping Context」と「Remove Mapping Context」の "Options" ピンは分割し、True でも False でも明示的に設定しようと思いました。

年明けからまた勉強になりました。


「Add Mapping Context」は追加と Priority を決めるだけで簡単に利用できるためか、細かい検証をしている情報には辿り着かなかったためこの記事を公開してみました。


今年は一本ゲーム完成を目指したい所です!!

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

わんころのUE5勉強会 2022/12/06 20:14

【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 のメリットを更に利用できるのになあ...と思いました。

是非またチャレンジしたい内容なので
情報が集まったら動画なりで紹介してみようと思います。

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

記事のタグから探す

月別アーカイブ

限定特典から探す

記事を検索