さけのさかなのブログ

同人ゲーム開発やってます。Unity使ったりする。

非同期シーン追加ロード、からの復帰

やること

 RPGのフィールドで敵に遭遇 -> ブワッ -> バトル -> フィールドに戻る、みたいな流れを作るためのシーンロード処理。

 具体的にやるべきなのは

  • ブワッとなってる間にバトルシーンを読み込む(非同期ロード)
  • バトルが終わったらフィールドに処理を戻す(フィールドを破棄せずバトルが終わったら復帰)

コード

Unity5.3.1p2

using UnityEngine.SceneManagement;

class Field : MonoBehaviour
{
    IEnumerator LoadBattleCoroutine()
    {
        var loadRequest = SceneManager.LoadSceneAsync("Battle", LoadSceneMode.Additive);
        loadRequest.allowSceneActivation = false;

        // ここでブワッ
        yield return new WaitForSeconds(10f);

        // FieldシーンとBattleシーンの両方にEventSystemが存在する場合は、ここでcurrent = nullしておくことで、Battle側のEventSystemに処理を移すことができる。
        UnityEngine.EventSystems.EventSystem.current = null;

        loadRequest.allowSceneActivation = true;
        yield return loadRequest;

        SceneManager.SetActiveScene(SceneManager.GetSceneByName("Battle"));               
        foreach (var obj in gameObject.scene.GetRootGameObjects())
        {
            // コルーチンをFieldシーンのオブジェクトに実行させた場合、ここでコルーチンが止まるので注意
            obj.SetActive(false);
        }
    }

    void UnloadBattleAndResume()
    {
        SceneManager.UnloadScene("Battle");
        SceneManager.SetActiveScene(gameObject.scene);
        foreach (var obj in gameObject.scene.GetRootGameObjects())
        {
            obj.SetActive(true);
        }
    }
}

ただし

 真面目にメモリとか気にするなら、フィールドシーンは破棄して復帰時に再構築しような。