Unityはじめました|複数のScene読み込み終了の通知は、あるある的なハマりどころ満載でした。

スポンサーリンク
Unity

こんにちは、あまのじゃくなHikaruAppです。

SceneManager.sceneLoaded += SceneLoaded;

Unityのsceneロードが終了したときに呼び出して欲しい、そんな時に使うんだけど

これ、複数のシーンを登録するとなんだか訳わからん的な事になる。
singletone的な物クラスを作った事がある人には、予想できる動作になるんだけど
Unity使いの人全員が、プロフェッショナルな人でな無いわけで、ここハマりどころになるんじゃないかなと思ったわけです。

複数sceneを読み込み終了したときのテストコード

※注意:問題(バグあり)のサンプルコード。

using UnityEngine;
using UnityEngine.SceneManagement;
 
public class SceneManagerEvent : MonoBehaviour {
 
    void Start () {
        SceneManager.sceneLoaded += SceneLoadedA;
        SceneManager.LoadScene("Scene_A");

        SceneManager.sceneLoaded += SceneLoadedB;
        SceneManager.LoadScene("Scene_B");
    }
     
    // Scene_A
    void SceneLoadedA (Scene nextScene, LoadSceneMode mode) {
        Debug.Log(nextScene.name);
        Debug.Log(mode);
    }

    // Scene_B
    void SceneLoadedB (Scene nextScene, LoadSceneMode mode) {
        Debug.Log(nextScene.name);
        Debug.Log(mode);
    }
}

SceneLoadedAは、SceneAが読み込み終了時にコールされると思っていたら間違いで、Scene_AとScen_Bの両方の読み込み終了時にコールされる。
もちろん、SceneLoadedBも同じ動作になる。

singletoneあるある、判別して欲しかったな。

それじゃ、ど〜するのよ?

どのSceneの読み込みが終了してコールされたかがわかればいいわけで、汚くなるけどif文が必要。

using UnityEngine;
using UnityEngine.SceneManagement;
 
public class SceneManagerEvent : MonoBehaviour {
 
    void Start () {
        SceneManager.sceneLoaded += SceneLoadedA;
        SceneManager.LoadScene("Scene_A");

        SceneManager.sceneLoaded += SceneLoadedB;
        SceneManager.LoadScene("Scene_B");
    }
     
    // Scene_A
    void SceneLoadedA (Scene nextScene, LoadSceneMode mode) {
        Debug.Log(nextScene.name);
        Debug.Log(mode);
        if ( nextScene.name == "Scene_A") {
            SceneManager.sceneLoaded -= SceneLoadedA;
            // Scene_Aの読み込み終了の処理
        }
    }

    // Scene_B
    void SceneLoadedB (Scene nextScene, LoadSceneMode mode) {
        Debug.Log(nextScene.name);
        Debug.Log(mode);
        if ( nextScene.name == "Scene_B") {
            SceneManager.sceneLoaded -= SceneLoadedB;
            // Scene_Bの読み込み終了の処理
        }
    }
}

ま、こんな感じです。

たかがif、されどif
ifは、バグの温床です。

ifを可能な限り書かない事をモットーに、脳みそフル回転。

日々修行。

コメント

タイトルとURLをコピーしました