お世話になっております。
<br/>
Action RPGサンプルでも使用されている GetMoviePlayer()->SetupLoadingScreen() を使用することで Open Level のローディング中もローディング画面を表示することが可能となっておりますが、現在開発中のプロジェクトでは Open Level 実行前にローディング画面をフェードインさせ、フェードインが完了してから Open Level を実行する、という方式を試しています。( それによってローディング画面が『パッ』と表示されるのを防いだり、ブラックフェードアウト以外のローディング画面導入を実現したりします )
ただ、この方法を試した所、Open Level 実行時に GetMoviePlayer()->SetupLoadingScreen() で設定した Widget が画面に表示される前に一瞬だけ真っ黒の画面が表示される為、
<br/>
ローディング画面フェードイン → 一瞬黒画面がチラつく → Open Level 中のローディング画面表示
<br/>
↑このように、ローディング画面がフェードインした後、一瞬だけ黒い画面がチラッと表示されることになっています。
添付のプロジェクト( LoadingScreenTest )では、プロジェクトを Development Editor ビルドして Unreal Editor を実行して頂き、スタンドアロンゲームで実行して頂くことで
『ローディング画面フェードイン → Open Level実行 → 一瞬黒画面チラつき → Open Level中のローディング画面』
の現象を確認して頂くことができます。
( グレーの背景に黒い矩形が左右に移動するのがローディング画面です。尚、LoadingScreenTestフォルダが SSDのドライブにあると一瞬でロードが完了してしまうので、HDDのドライブに LoadingScreenTestフォルダを入れてお試しください )
<br/>
お忙しい所申し訳ありませんが、こちらの『一瞬黒画面が表示される』現象について回避する方法等ありましたらご教示いただければと思います。
よろしくお願いいたします。
LoadingScreenTest.zip(620 KB)
再現手順
1.Open Level を実行する前に GetMoviePlayer()->SetupLoadingScreen() を実行して、ローディング中に Widget を再生するように設定する
2.プロジェクトを『スタンドアロンゲーム』で実行した後、GetMoviePlayer()->SetupLoadingScreen() 実行後、Open Level を実行する
3.SetupLoadingScreen() で設定した Widget が表示される前に一瞬だけ真っ黒の画面が表示されるのを確認する
再現プロジェクトのご用意ありがとうございました。
プロジェクトを確認してみるとレベル遷移の一瞬Worldが無くなるタイミングでGameInstanceが取得できないために早期リターンの分岐が処理されて、Draw_Widget関数がスキップされています。
WidgetはOuterがGameInstanceなのでそれを取得したり、Engine->GameViewportを経由してGameInstanceを取得するなどの方法で安定的にステートを管理するオブジェクトを取得し描画することで問題を回避することができると思います。
//ヘッダ
UFUNCTION(BlueprintCallable, BlueprintPure=false)
void NativeOnPaint( UPARAM(ref) FPaintContext& Context ) const;
//C++
void ULoadingScreenWidget::NativeOnPaint( FPaintContext& Context ) const
{
ULoadingScreenTestGameInstance* pGameInstance = Cast<ULoadingScreenTestGameInstance>( GetOuter() );
...
pEngine->GameViewport->GetGameInstance()
お世話になっております。
ご返答ありがとうございます。
GetOuter() を使用する方法と、pEngine->GameViewport->GetGameInstance() を使用する方法、どちらでも GameInstance を取得することができ、一瞬表示される黒画面が無くなることを確認できました!
ご対応頂きありがとうございます!