i-school - 非同期処理によるシーンの読み込み機能
 シーン遷移を円滑にするための設計として、先のシーンを事前に読み込んでおき、準備が出来てから現在のシーンよりシーン遷移を行う機能について実装します。

 今回はタイトルシーンからメインのゲームシーンへの遷移を行い、メインシーンの読み込み時間が長いケースを想定しています。

 タイトルシーン内でメインシーンの読み込みを非同期処理で行い、読み込みが終了してからシーン遷移用のボタンを有効化することで、
ボタンを押したらすぐにメインシーンにシーン遷移できるように設計しています。


<実装動画>
動画ファイルへのリンク



事前準備を行う


 シーン遷移の実装になりますので、2つ以上のシーンを用意してください。
今回の例では、Title シーンと Main シーンを作成し、Title シーンから Main シーンへとシーン遷移させています。

 Title シーンにはゲームスタート用のボタンを1つ配置してください。


Sceneビュー画像


 以上で事前準備は完成です。


UniRx をインポートする


 UniRx アセットを利用していますので、アセットストアから UniRx のインポートをしてください。

Unity Asset Store
UniRx - Reactive Extensions for Unity
https://assetstore.unity.com/packages/tools/integr...


Title スクリプトを作成する


 ボタンの制御とシーン遷移を制御するためのスクリプトを作成します。


Title.cs

<= クリックすると開きます。



<AsyncOperation クラス>


 非同期処理であるコルーチンメソッド内で動作するクラスです。
主に次に説明をする LoadSceneAsync メソッドの戻り値として利用されており、非同期によるシーンの読み込み情報や、読み込みが終了したシーンへの遷移を一時停止したりする機能があります。
 

  private AsyncOperation async;

Unity公式スクリプトリファレンス
AsyncOperation
https://docs.unity3d.com/ja/current/ScriptReferenc...


<SceneManagement.SceneManager.LoadSceneAsync メソッド>


 SceneManager クラスのメソッドの1つです。シーン遷移を非同期処理として実行します。
戻り値は AsyncOperation 型になりますので、AsyncOperation 型の変数に代入することにより、読み込み状態の進捗を確認することが出来ます。


 // 非同期処理でシーンの遷移実行(現在実行しているシーンのバックグラウンドで次のシーンの読み込みを事前に行う)
  async = SceneManager.LoadSceneAsync(nextSceneName);

Unity公式スクリプトリファレンス
SceneManagement.SceneManager.LoadSceneAsync
https://docs.unity3d.com/ja/current/ScriptReferenc...


<AsyncOperation.allowSceneActivation 変数>


 AsyncOperation クラスの持つ bool 形の変数です。
非同期によるシーンの読み込み準備が完了したら、すぐに実行させるほか、
false に設定しておくことにより、シーンの読み込みが終了してもすぐにシーン遷移を実行せずに、
true に切り替えたタイミングでシーン遷移を送らせて実行する処理が実装出来ます。

 この変数はコルーチンメソッド内でしか動作しません。


 // 非同期処理でシーンの遷移実行(現在実行しているシーンのバックグラウンドで次のシーンの読み込みを事前に行う)
  async = SceneManager.LoadSceneAsync(nextSceneName);

 // シーンを読み込み終わってもシーン遷移は行わない状態にする
  async.allowSceneActivation = false;
 

 // 適宜なタイミングで以下を実行する

 // 非同期処理でシーンの遷移実行(現在実行しているシーンのバックグラウンドで次のシーンの読み込みを事前に行う)
  async.allowSceneActivation = true;


https://docs.unity3d.com/ja/current/ScriptReferenc...


Title スクリプトをゲームオブジェクトにアタッチして設定を行う


 空のゲームオブジェクトを Create Empty で作成し、Title スクリプトをアタッチします。
ボタンの情報を登録しておいてください。


インスペクター画像



 以上で設定は完了です。


ゲームを実行して動作を確認する


 ゲーム開始と同時にスタートボタンが押下できない状態になります。
その後、次のシーンの読み込みが完了した時点で、スタートボタンが押下できる状態になります。

 実際にスタートボタンを押してみてください。
すぐに次のシーンが開始されれば制御成功です。

 ヒエラルキーにおいても非同期で読み込んでいる次のシーンの情報を確認できます。


ヒエラルキー画像(Main シーンが (isLoading の状態で非アクティブとして読み込まれている))



<実装動画>
動画ファイルへのリンク




 以上で完成です。