Suutaの秘密基地

動く...動く...

UE4 レベルの読み込みインジケーターっぽいやつ

ローディング画面といえば

ローディング画面のロードアイコンといえば何か? グルグル回ってるやつ、アニメーションするNowLoadingの文字…など色々あると思いますが、なにを思い浮かべますか? 個人的には読み込み具合がにわかる横長のインジケータ型の印象が大きいです。横長のインジケータ型の最大の特徴は、現在の読み込み具合が視覚的に分かるところです。ただ、全然進まない(重いレベルをロードする際に)とイライラしますし、90%からなかなか進まないとかよくありますよね。事前データのダウンロードとかモバイル版のゲームではよく見かけますが、家庭用機のインゲームではあまり使われている印象がないです。 有名どころのゲームでいえば、モンハンワールド・SEKIRO・Fortniteなどで使われてますが、ロード時間が長いゲームに採用されるんでしょうか? ということで今回は、ProgressBarを使ってレベルの読み込みインジケーターっぽいやつを作ります。

やってみる

SLoadingScreen.h


SLoadingScreen.h


レベルの読み込み具合は GetAsyncLoadPercentage( ) を使って割合を取得します。非同期で読み込んでいるパッケージの割合を百分率で返し、引数で指定したパッケージが無い場合は-1が返ってきます。 これを使ってロード中のFAsyncPackageの読み込み具合を取得し、それをSprogressBarにバインドすることでインジケーターを更新します。 また、プロジェクトをパッケージして実行しないと動作しないことに注意してください。スタンドアローンでもダメです。 docs.unrealengine.com

ローディング画面の再生は毎度お馴染みのFLoadingScreenAttributesとMoviePlayerで再生を行うので、詳細は省略します。詳しくは下記事を参考にしてください。
suuta-blog.hatenablog.com

問題点

f:id:suuta1123:20200731225736p:plain

プロジェクトをパッケージングしないと確認できない

前述したように、プロジェクトをパッケージして実行しないと動作しません。正確にはEDL(Event Drive Loader)が有効になるパッケージ時(パッケージ設定でデフォルトでオンになっています)に動作します。スタンドアローンで確認出来るといいんですけど…

f:id:suuta1123:20200802142630j:plain

ロードが早すぎる

マジで速いです。ゴーストオブツシマの比じゃなく速いですw これならローディング画面いらないし、画面暗転の方が良いです。 テストのために重たいレベルを作ろうと思い、ElvenRuinsのアクターを適当にコピーし10,000アクターくらいのレベルを用意しました。 しかし、1秒くらいでロードが完了してしまいました... 実際に発売されるタイトル級のレベルを用意しないと検証できないんですかね? どれくらいのアクター数なんでしょうか。

おわりに

GetAsyncLoadPercentageを使ったロード進捗の取得は動作しましたが、パッケージングしないと確認できませんでした。 どうやらスタンドアローンやPIEでOpenLevelした時とは動作が異なるっぽい? エディターで確認したいなら、スタンドアローン時にFAsyncPackageを使用するようにするか、 GetAsyncLoadPercentage以外でロード進捗をカウントする方法をとらないといけないようです。どちらにせよエンジンコードいじらないといけないですね...