最近こういう感じで実装している。
SceneA.cs
using UnityEngine;
using UnityEngine.SceneManagement;
using UniRx;
public class SceneA : MonoBehaviour {
public void LoadSceneB() {
SceneManager.LoadSceneAsync("SceneB").AsObservable()
.Subscribe(_ => {
var sceneB = FindObjectOfType<SceneB>() as SceneB;
sceneB.Param = new SceneB.Parameter { IntParam = 999 };
});
}
}
SceneB.cs
using UnityEngine;
public class SceneB : MonoBehaviour {
public class Parameter {
public int IntParam;
}
public Parameter Param;
void Start () {
Debug.Log(this.Param.IntParam);
}
}
要は、SceneBのロードが完了したタイミングで、SceneB上のオブジェクトのPublic変数に、直接値をセットする。
LoadSceneAsync
で非同期ロードすると、ロード完了のタイミング(Awake
とStart
の間)で処理が実行できる。
上記はUniRx
を使ってるけど、UniRx
を使わない場合はこんな感じ。
SceneA.cs
using UnityEngine;
using UnityEngine.SceneManagement;
using System.Collections;
public class SceneA : MonoBehaviour {
public void LoadSceneB() {
StartCoroutine(this.invokeActionOnloadScene("SceneB", () => {
var sceneB = FindObjectOfType<SceneB>() as SceneB;
sceneB.Param = new SceneB.Parameter { IntParam = 999 };
}));
}
private IEnumerator invokeActionOnloadScene(string sceneName, System.Action onLoad) {
var asyncOp = SceneManager.LoadSceneAsync(sceneName, LoadSceneMode.Additive);
yield return asyncOp;
onLoad.Invoke();
SceneManager.UnloadScene(SceneManager.GetActiveScene().buildIndex);
}
}
ロード完了した時点で前のシーンがUnloadされてしまうので、
LoadSceneMode.Additive
で追加ロードにして、最後に自分をUnloadしている。
(もっと良い方法がありそう)
ついでに、SceneB単体で確認できるように、パラメータがnullの場合のデフォルト値を入れるようにすると良いと思う。
SceneB.cs
void Start () {
#if UNITY_EDITOR
if (this.Param == null) {
this.Param = new Parameter { IntParam = 111 };
}
#endif
Debug.Log(this.Param.IntParam);
}