29
24

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

[Unity] シーン切り替え時にパラメータを渡す

Posted at

最近こういう感じで実装している。

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で非同期ロードすると、ロード完了のタイミング(AwakeStartの間)で処理が実行できる。

上記は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);
	}
29
24
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
29
24

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?