UE4 もっとローディング画面➀
概要
前の記事でActionRPGの非同期ローディング画面のサンプルをもとにカクつかないロード画面を作った。ただ、ロード画面UIのレイアウトを凝りたい時にSlateから作るのはしんどいので、 UMGで作ったUIをローディング画面で使えるようにした。また、その過程で得た知見も一緒にまとめてみた。
振り返り<カクつかないのが最低条件>
はじめてのローディング画面
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で編集
BP_SuutaGameInstance
クラスのデフォルトからロード画面に使うUMGを選択、Initの親関数呼び出しを行う
ロード画面の呼び出し
これは手動で呼び出した場合のノードです。 デリゲートした場合はPlayUMGLoadingScreen( )を呼ばなくても、OpenLevel( )するだけでロード画面が再生されます。 スタンドアローンでプレイすることを忘れずに。ActionRPGの非同期と違って、デザインの反映が簡単に行えるようになってよかった。ただ、ロードアイコンがエンジンのWidgetなので自作のアイコンを用意できるようにしたい。
動画
参考
https://answers.unrealengine.com/questions/357232/view.htmlanswers.unrealengine.com