こんにちは、あまのじゃくな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を可能な限り書かない事をモットーに、脳みそフル回転。
日々修行。
コメント