【Unity】Sceneをまたいだ値の受け渡し方


初めに

Scene間での値の受け渡しに関してはまだ様々なところでこっちの方がいい、あっちの方がいいなど議論されています、ですのでどれが正解なのかは各個人によって決まります。
今回はいくつかの方法をお伝えできればと思います。

目次

  • DontDestroyOnLoad
  • PlayerPrefs
  • 静的クラスまたは静的変数

DontDestroyOnLoad

UnityにはDontDestroyOnLoadという関数があります、この関数はObjectをSceneをまたいでも引き継がれるObjectにするための関数です。
このDontDestroyOnLoadなObjectに値を渡すことで次のSceneでも値を引き継ぐことができます。

サンプルコード

    //値を保存用
    public int Score { set; get;}

    void Start()
    {
    //↓これを呼び出せばDontDestroyObjectにできます
    DontDestroyOnLoad(gameObject);
    }

実行結果

PlayerPrefs

PlayerPrefsに関しては過去にまとめた記事がありますのでこちらを参照してください。

サンプルコード

値を保存

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.A))
        {
            PlayerPrefs.SetInt("Score",int.Parse(GetComponent<InputField>().text));
            SceneManager.LoadScene("2");
        }
    }

値を呼び出す

    void Start()
    {
        GetComponent<Text>().text = PlayerPrefs.GetInt("Score").ToString();
    }

実行結果

静的クラスまたは静的変数

静的クラスなどはゲーム開始時に最初にメモリ領域を確保してゲーム終了までそのメモリ領域を解放しませんので値が常に保持されているということができます。

サンプルコード

値保存用クラス

public static class Test
{
    public static int Score { set; get;}
}

値を入れる

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.A))
        {
            Test.Score=int.Parse(GetComponent<InputField>().text);
            SceneManager.LoadScene("2");
        }
    }

値を呼び出す

    void Start()
    {
        GetComponent<Text>().text = Test.Score.ToString();
    }

実行結果

まとめ

実行結果が少しわかりずらいのでなくてもよかったかな?って感じる…
ぶっちゃけScene間の値のやり取りって難しいですよね、今回記事にした内容以外にもいくつかやり方ありますし、そもそもScene遷移しないという選択肢もあるわけで…
とりあえず色々試して自分に一番合うものをお探しください!