UnityのLoadSceneAsyncでの非同期処理

TOC

  1. なぜ?
  2. LoadSceneAsync を使おう!

こんにちはー!!

Unity 5.3 から、Multi Scene Editing が追加されましたね。

そこで、シーンを読み込んでから、GameObject.Find をする、
次のようなコードを動かしたのですが、うまくいきません。

TestGameObject は、追加するシーン Scene2 に入っているものとします。

1
2
3
4
5
void LoadScene2()
{
SceneManager.LoadScene("Scene2", LoadSceneMode.Additive);
Debug.Log(GameObject.Find("TestGameObject"));
}

実行してみると、Null が返ってきます。

unity-loadsceneasync-ok

なぜ?

これは、Scene2 が読み込まれるまで待たないで、
GameObject.Find を呼び出してしまっているからです!

LoadSceneAsync を使おう!

お、LoadSceneAsync とかいう、それらしい名前のがあるではないか。
そこで、LoadSceneAsync を使おうとしましたが、ハマりました。
C# の、async / await でするものだと間違えていて、
あれ?Unityの C# のバージョンじゃ、async とか使えなくねー・・

(使う方法もあります)

しかし、LoadSceneAsync の戻り値は、「UnityEngine.AsyncOperation」でした・・。
アシンクオペレーションってなんだっけ?(検索中)
そう、コルーチンを使うんだ。(`・ω・´)ゞ

1
2
3
4
5
6
7
8
9
void LoadScene2()
{
StartCoroutine("LoadScene2Coroutine");
}
IEnumerator LoadScene2Coroutine()
{
yield return SceneManager.LoadSceneAsync("Scene2", LoadSceneMode.Additive);
Debug.Log(GameObject.Find("TestGameObject"));
}

unity-loadscene-null

これでシーンが読み込まれるまで待機してくれるようになりました。