トップ 差分 一覧 ソース 検索 ヘルプ RSS ログイン

unity_script_change_scene_progress_pro_only

シーンを切り替える際に読み込み途中経過を取得/非同期読み込み (Proのみ)


Unity Proのみの関数として「Application.LoadLevelAsync」が存在します。
シーンを「Application.LoadLevel」で読み込んで切り替えた場合は、シーンの読み込みが完了するまで待たされます。
特にモバイルではフリーズしたかのようになることがあります。

「Application.LoadLevelAsync」を使用すると、裏で(非同期で)シーンの読み込みを行います。そのため、すぐに次の処理に移ることができます。

 シーンの読み込み開始

private AsyncOperation m_AsyncOpe = null;
void Start () {
  // 非同期でシーン「mainScene」を読み込み.
  m_AsyncOpe = Application.LoadLevelAsync("mainScene");
  
  // シーン読み込み完了後、自動的にシーンを切り替えないようにfalseを指定.
  m_AsyncOpe.allowSceneActivation = false;
}

次に移行するシーンを「mainScene」という名とすると、上記のようにカレントシーンの初期化時に次のシーンの読み込みを同時に行います。
ただし、確実に次のシーンとして「mainScene」を呼び出すようにしてください。
「Application.LoadLevelAsync」後にシーンが切り替わらないうちに「Application.LoadLevel」で別のシーンをロードすると、Unityがフリーズしました。

「Application.LoadLevelAsync("mainScene");」でmainSceneという名のシーンを読み込み開始。
戻り値はAsyncOperationクラスで受け取ります。
続いて「m_AsyncOpe.allowSceneActivation」をfalseにしないと、シーン読み込み完了とともにシーンが移ってしまうので注意。

この後、Update関数のような定期的に呼び出しが繰り返される関数内で
「m_AsyncOpe.progress」をチェックすると、0.0〜0.9の進行状況を確認できます。
これで、プログレスバーなどで進行を表示できますね。

progressの値は0.9になると読み込み自体が完了した、となるようです。
その後、m_AsyncOpe.allowSceneActivationをtrueにすることでシーンを移行します。

private bool m_sceneChanged = false;  // 次のシーンに移行したかどうかのフラグ.
void Update() {
  if (!m_sceneChanged && m_Async.progress >= 0.9f) {
    // 次のシーンに移行.
    m_Async.allowSceneActivation = true;
    m_sceneChanged = true;
  }
}

少し重いシーンを非同期で読み込む場合は、Start関数でApplication.LoadLevelAsyncを呼んだ場合でもモバイルで一瞬止まった状態になることがありました。
これを回避するには、描画処理のUpdate関数が何回か呼ばれた後にApplication.LoadLevelAsyncで次に移るシーンを呼ぶとよいかと思います。


最終更新時間:2014年04月22日 16時57分29秒