Unityで複数のシーン間でデータの受け渡しをする方法を調べました。
- staticな変数に保持しておく
- シングルトンを利用
- (非推奨)DontDestroyOnLoadを利用
- マルチシーンを利用
- ScriptableObjectを利用
- ストレージに値を保存
- おすすめ書籍
staticな変数に保持しておく
staticな変数に保存するのが、一番単純な方法です。シーンを跨いでも消えることはなく利用できます。
例
public static int count = 0;
シングルトンを利用
staticな領域に値を保存する発展系として、シングルトンパターンを適用したクラスにデータを保存しておく方法もあります。
シングルトンとは、全体を通してインスタンスが一つになる性質がある物のことをさします。
シングルトンパターンの例
using System; public sealed class ExClass { private static ExClass c = new ExClass(); private ExClass() // privateのコンストラクタ { } public static ExClass GetInstance() { return c; } }
この場合は、MonoBehaiviorではなく、System.Objectを継承してクラスを実装
(非推奨)DontDestroyOnLoadを利用
MonoBehavioutのクラス内で利用できるDontDestroyOnLoad関数の引数にゲームオブジェクトのインスタンスを指定すると、そのゲームオボジェクトは明示的にDestroy関数を利用しない限りは削除されなくなる。
これにより、シーンの切替に関係なく、常に存在するゲームオブジェクトのコンポーネントにデータを保持しておくことができる。
ただしこの方法は2021年現在、既に非推奨らしいです。
マルチシーンを利用
複数シーン編集によって、複数のシーンを同時にエディター上で開くことが可能になり、実行時でも簡単に複数シーンを管理できるようになりました。
これにより、破棄しないデータ保存用のシーンとコンポーネントを王位できるようになります。
DontDestroyOnLoadよりもより細かく独自の制御が可能ですが、管理や仕組みを構築するの難易度高め。
こちらを参考:
複数シーンの編集 – Unity マニュアル
ScriptableObjectを利用
DontDestroyOnLoad関数が非推奨なので公式では、こちらの方法を推しているようです。
構造としてはシングルトンパターンをよりスマートにしてUnityにフィットさせたような感じです。
チュートリアルは以下から
ストレージに値を保存
一旦、データをUnity外のファイルやデータベースなどに保存しておく方法です。ハイスコアやシステム設定など、端末に保存すべき簡単なデータであればこの方法が良いとのこと。