UnityのLoadSceneAsyncでの非同期処理

こんにちはー!!

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

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

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

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 とか使えなくねー・・

(使う方法もあります)

【感動】UnityでC# 6.0 が使えた!!
追記:朗報Unity 2017 からは、デフォルトで C# 6.0 および .NET 4.6 が使用可能なようです!この記事では Unity 5 での場合を紹介しています。こんにちはー!!Unityで...

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

void LoadScene2()
{
    StartCoroutine("LoadScene2Coroutine");
}
IEnumerator LoadScene2Coroutine()
{
    yield return SceneManager.LoadSceneAsync("Scene2", LoadSceneMode.Additive);
    Debug.Log(GameObject.Find("TestGameObject"));
}

unity-loadscene-null

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