はじめに
シーン遷移時に簡単にデータを渡すことができるパッケージ
「Unity Scene Data Transfer」を GitHub に公開しました
インストール
"com.baba_s.unity-scene-data-transfer": "https://github.com/baba-s/unity-scene-data-transfer.git",
manifest.json に上記の記述を追加します
使い方
シーンの名前とシーンを制御するコンポーネントの名前は同じにしておきます
public class ResultData { public int Score; public int Rank; }
まず、シーンに渡したいデータを管理するクラスを定義して、
using UnityEngine; public class ResultScene : MonoBehaviour {
シーンを制御する MonoBehaviour のコンポーネントを
using KoganeUnityLib; using UnityEngine; public class ResultScene : SimpleSceneBase<ResultScene, ResultData> {
SimpleSceneBase を継承するように変更します
using KoganeUnityLib;
を追加する必要があります- SimpleSceneBase の型パラメータには、シーンのクラスとデータのクラスを指定します
using KoganeUnityLib; using UnityEngine; public class ResultScene : SimpleSceneBase<ResultScene, ResultData> { private void Start() { Debug.Log( entryData.Score ); Debug.Log( entryData.Rank ); }
すると、entryData プロパティを使用して、
他のシーンから渡されたデータを参照できるようになります
var data = new ResultData { Score = 5000, Rank = 3, }; ResultScene.Load( data );
あとは、他のシーンで上記のようなコードを記述することで、
データを渡しながらシーン遷移できます
補足
Awake や OnEnable では entryData を使用できない
public class ResultScene : SimpleSceneBase<ResultScene, ResultData> { // ダメ private void Awake() { Debug.Log( entryData.Score ); Debug.Log( entryData.Rank ); } // ダメ private void OnEnable() { Debug.Log( entryData.Score ); Debug.Log( entryData.Rank ); }
- Awake や OnEnable で entryData プロパティを参照しても正常な値を取得できません
- entryData プロパティは Start 以降で正しく参照することができます
シーンを直接起動した時に entryData を使用する方法
シーンを直接起動した時は entryData は null になっています
public class ResultScene : SimpleSceneBase<ResultScene, ResultData> { private void Start() { var data = entryData ?? new ResultData(); Debug.Log( data.Score ); Debug.Log( data.Rank ); }
そのため、上記のようなコードを記述することで、
シーンを直接起動した時は初期値を使用する、といったことができるようになります
using System; [Serializable] public class ResultData { public int Score; public int Rank; }
もしくは、シーンのデータを管理するクラスに Serializable 属性を適用することで
シーンを直接起動した時の entryData のパラメータを
Unity の Inspector で設定することができます