シーンをロードするとSceneManager.LoadSceneAsync()、実際には2つのことが起こります。
- シーンのゲームオブジェクトがメモリにロードされます。
- 次に、シーン全体が有効になります。すべてのAwake()およびStart()コールバックは、シーン内のオブジェクトに対して呼び出されます。
シーンを有効にする2番目のステップは、Unityがスクリプト内のすべての初期化コールバックを1サイクルで実行しているため、実際にUnityをフリーズすることです。
実際、に設定SceneManager.LoadSceneAsync().allowSceneActivationするfalseと、非同期操作はプロセスの最初のステップのみを完了し、プロセスtrueの2番目の部分を開始するように設定されるまで待機します。
ただし、次のようにコールバックを設定allowSceneActivationしfalse、それに譲歩すると、ゲームは永久にフリーズします。
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.9f、allowSceneActivationフラグを待機するとすぐに停止します。
次のようになります。
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コールバックをミニムに保持し、スクリプトを数サイクルにわたってコルーチンで初期化する必要があります。