はりうすブログ (のすけのメモ)

湘南にある小さな会社 代表 ”のすけ”のブログです

Unityでのシーン間のデータの受け渡し方法6選

Unityで複数のシーン間でデータの受け渡しをする方法を調べました。

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年現在、既に非推奨らしいです。

こちらを参考:
Object-DontDestroyOnLoad - Unity スクリプトリファレンス

マルチシーンを利用

複数シーン編集によって、複数のシーンを同時にエディター上で開くことが可能になり、実行時でも簡単に複数シーンを管理できるようになりました。
これにより、破棄しないデータ保存用のシーンとコンポーネントを王位できるようになります。

DontDestroyOnLoadよりもより細かく独自の制御が可能ですが、管理や仕組みを構築するの難易度高め。

こちらを参考:
複数シーンの編集 - Unity マニュアル

ScriptableObjectを利用

DontDestroyOnLoad関数が非推奨なので公式では、こちらの方法を推しているようです。

構造としてはシングルトンパターンをよりスマートにしてUnityにフィットさせたような感じです。

チュートリアルは以下から

Achieve better Scene workflow with ScriptableObjectsScriptableObject を使ってシーンワークフローを改善しよう - Unity Technologies Blog


ストレージに値を保存

一旦、データをUnity外のファイルやデータベースなどに保存しておく方法です。ハイスコアやシステム設定など、端末に保存すべき簡単なデータであればこの方法が良いとのこと。


おすすめ書籍

Unityを学ぶ上でおすすめはこちらの書籍です。丁寧解説していてとても分かりやすかったです。