【Unity】シーンを非同期的に読み込む【LoadSceneAsync】
普段、Unityでシーンを読み込む際にはSceneManagerのLoadScene()というメソッドを用いると思います。
トランジションなど設定している場合は魅せ方の工夫は多少できますが例えば、
- ローディング画面を作りたい
- シーンの最初でリソースのプリロード(オフライン処理)を行いたいが待機時間が発生してしまう
といった場面に当たることがあります。
ここで使えるのが「非同期でのシーン読み込み」です。
async/awaitはご存知でしょうか?
awaitの時点で指定された条件に合っていなければ合うまで待つ、すなわち同スコープ内のawait以下に書かれている処理を条件に合うまで実行しないという優れものです。
これはFuture(Promise)パターンとも呼ばれ、非同期処理を実装しています。
「非同期でのシーン読み込み」と照らし合わせて考えると、「シーンの読み込みが完了するまで次の処理を行わない」と考えることができます。
SceneManagerのLoadSceneAsync()で実装でき、
- シーンを読み込んでいる間の待機時間中の処理
- 読み込み後、シーンを有効化するタイミングを任意で指定
といったことができます。
LoadSceneAsyncの返り値はAsyncOperationです。
AsyncOperation.isDone
シーンの読み込みが終わったらtrueになります。
AsyncOperation.progress
ローディングの進捗状況を表します。
AsyncOperation.allowSceneActivation
これはデフォルトだとシーンの読み込みが完了したらただちにシーンを有効化します。
なのでこれをfalseに設定しておくことで、シーンの有効化するタイミングを任意に設定することができます。
allowSceneActivationがfalseの場合、AsyncOperationのisDoneはfalse、progressは0.9で止まります。なので、progressの値を使ってなにか処理を行っている場合などは注意が必要です。