Suutaの秘密基地

動く...動く...

UE4 もっとローディング画面➀

概要

前の記事でActionRPGの非同期ローディング画面のサンプルをもとにカクつかないロード画面を作った。ただ、ロード画面UIのレイアウトを凝りたい時にSlateから作るのはしんどいので、 UMGで作ったUIをローディング画面で使えるようにした。また、その過程で得た知見も一緒にまとめてみた。

振り返り<カクつかないのが最低条件>

はじめてのローディング画面

f:id:suuta1123:20200624215349j:plain UE4ではじめてローディング画面を作った時はこんな感じだった。OpenLevelの前にローディングのUIを表示して2秒間Delayさせてそれっぽく見せていた。 もちろんOpenLevel中はヒッチが起きるので、ロードアイコンが止まってしまい …ローディング画面とは?

ActionRPGの非同期ローディング画面

次にヒッチが起きないように ということでActionRPGのサンプルと参考に非同期ローディング画面を試した。SlateとMoviePlayerを使用し、BlueprintFunctionLibrary経由でローディング画面を再生した。 Slateはメインのゲームスレッドとは別スレッドで動作するということで、OpenLevel中でもカクつかずにローディング画面が再生された。冒頭でも言ったように最低条件はクリアしたが、肝心のUIデザインが Slateからしか行えないというオチだった。Slateわかんねぇよ、ぴえん。 ただ、デフォルトで用意されているアニメーションのついたThrobber、CircularThrobber、SpiningImageなどを使えばいい感じに出来る。

やってみる

ActionRPGではメインGameモジュールの外部にLoadingScreenモジュールを作ってBlueprintFunctionLibrary経由でMediaPlayerでローディング画面を表示させた。今回も仕組みは同じだけど、LoadingScreenモジュールは作らない。


USuutaGameInstance.h


USuutaGameInstance.cpp

BindLoadingScreen( )ではエディターで指定したUMGを、UUserWidget::TakeWidget( )でSWidgetに変換。 BeginLoadingScreeとEndLoadingScreenでMoviePlayerの再生・停止を任意のタイミングで行える。 今回はFCoreUObjectDelegatesのPreLoadMapとPostLoadMapWithWorldにバインドし、 レベルのロード開始・終了のタイミングに自動で再生・停止を行うようにしてある。


BPFunctionLibrary.cpp

デリゲートせず、手動で再生・停止を行う時のためにBPFunctionLibraryにまとめる。また、デリゲートの場合は引数が決められているので FLoadingScreenAttributesの設定が面倒だが、手動の場合は引数で渡してやることができるので、オーバーロード関数を作るのもいいかもしれない。

エディター側の設定

UMGで編集

f:id:suuta1123:20200625003658j:plain

BP_SuutaGameInstance

f:id:suuta1123:20200625215443j:plain f:id:suuta1123:20200625215439j:plain クラスのデフォルトからロード画面に使うUMGを選択、Initの親関数呼び出しを行う

ロード画面の呼び出し

f:id:suuta1123:20200625002523j:plain これは手動で呼び出した場合のノードです。 デリゲートした場合はPlayUMGLoadingScreen( )を呼ばなくても、OpenLevel( )するだけでロード画面が再生されます。 スタンドアローンでプレイすることを忘れずに。ActionRPGの非同期と違って、デザインの反映が簡単に行えるようになってよかった。ただ、ロードアイコンがエンジンのWidgetなので自作のアイコンを用意できるようにしたい。

動画

youtu.be

参考

https://answers.unrealengine.com/questions/357232/view.htmlanswers.unrealengine.com