シーン間のスムーズなロード画面


14

次のシーンの読み込み中に読み込みアニメーションを表示する読み込み画面を作成しました。次のシーンを非同期で読み込みます:

yield return SceneManager.LoadSceneAsync(scene,LoadSceneMode.Additive);

また、を設定Application.backgroundLoadingPriority = ThreadPriority.Low;しますが、動作は通常のレベルのロードと同じです。

何か不足していますか?

予想される動作:

  • 出口レベル、およびフェードアウト。
  • ロード画面が表示されます。
  • ロードが完了したら、ロード画面をフェードアウトします。
  • 次のシーンにフェードインします。

何が起こっている:

  • 出口レベル、およびフェードアウト。
  • 読み込み画面が表示され、フリーズします
  • 突然新しいシーンがフェードインします。

ロードが開始されると、ゲームは通常のシーンロードのようにフリーズします。

を設定する必要があることを読みましたallowSceneActivation = falseので、読み込み画面をフェードアウトしてから、true読み込みが完了するように設定できますが、非同期操作が読み込みを完了しないように、これによりゲームが完全にフリーズします。


私にはこの問題があり、ここには何も見つかりませんでした。グーグルで調べた後、この問題の原因を突き止めました。他の人が答えを簡単に見つけられるように、ここに投稿することにしました。あなたが私の答え/質問にいくつかの改善を加えるかどうか教えてください。ありがとう!
レオ

回答:


18

シーンをロードするとSceneManager.LoadSceneAsync()、実際には2つのことが起こります。

  • シーンのゲームオブジェクトがメモリにロードされます。
  • 次に、シーン全体が有効になります。すべてのAwake()およびStart()コールバックは、シーン内のオブジェクトに対して呼び出されます。

シーンを有効にする2番目のステップは、Unityがスクリプト内のすべての初期化コールバックを1サイクルで実行しているため、実際にUnityをフリーズすることです。

実際、に設定SceneManager.LoadSceneAsync().allowSceneActivationするfalseと、非同期操作はプロセスの最初のステップのみを完了し、プロセスtrueの2番目の部分を開始するように設定されるまで待機します。

ただし、次のようにコールバックを設定allowSceneActivationfalse、それに譲歩すると、ゲームは永久にフリーズします。

AsyncOperation AO = SceneManager.LoadSceneAsync(scene,LoadSceneMode.Additive); 
AO.allowSceneActivation = false;
yield return AO;

//Fade the loading screen out here

AO.allowSceneActivation = true;

どうして?シーンのロードの2番目のステップに進まないようにAsync操作に指示しているため、操作は完了しません。

操作の最初の部分がいつ準備ができたかを知りたい場合、2番目の部分を続行するには、に依存する必要がありAsyncOperation.progressます。この値は0.9fallowSceneActivationフラグを待機するとすぐに停止します。

次のようになります。

AsyncOperation AO = SceneManager.LoadSceneAsync(scene,LoadSceneMode.Additive); 
AO.allowSceneActivation = false;
while(AO.progress < 0.9f)
{
    yield return null
}

//Fade the loading screen out here

AO.allowSceneActivation = true;

シーンのアクティブ化でゲームがフリーズしないようにするには、AwakeおよびStartコールバックをミニムに保持し、スクリプトを数サイクルにわたってコルーチンで初期化する必要があります。


0

Unity 5.6でもまったく同じ問題があり、すでにyieldステートメントに追加してみました。Unityのメインスレッドをブロックし、現在のシーンが読み込みの進行状況をうまく表示できないのは、LoadSceneAsync自体でした。

私の知る限り、Unityのバグのようです。私のシーンがそれほど複雑ではなかったとき、私のコードは素晴らしくスムーズに移行しました。大きくなると、Unityはスレッドを約6秒間ブロックしましたが、その間、操作はおそらく「非同期」であるにもかかわらず、ゲームが「応答していません」として座っていました。

この問題を解決する方法は、照明を見ることでした。過去に照明とこの機能に大きなバグがありました。だから私は自分のオブジェクトを調べてみて、1つのオブジェクトにスポットライトがかかっていることがわかりました(それが無効になっていても...)

スポットライトを削除しました。シーンは正しく非同期にロードされます!ロックなし!


編集前は、この投稿は実際に問題の解決策を提供していませんでした。修正プログラムを追加したので問題ありませんが、将来、「この問題も抱えています」と言いたい場合は、その目的のために回答を使用しないでください。少しの担当者を獲得すると、既存の投稿にコメントしたり、質問に報奨金を置いて新しい回答を促すことができます。
DMGregory
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.