【Unity 入門】シーンをまたいでデータを失わずに共有する3つの方法【初心者向け完全ガイド】

Unityでシーンを切り替えたとき、「スコアがリセットされてしまった」「設定が引き継がれない」「進行状況が消える」といった悩みはありませんか?本記事では、増え続けるUnity初心者のそんな「困った!」を解決するために、シーンをまたいでデータを保持・共有する3つの方法を、実際に使えるコード付きで、丁寧に解説します。

PR

はじめに:データを引き継ぐ必要性とは?

Unityでは、シーンごとに新たなオブジェクトが生成されるため、変数は基本的にリセットされます。以下のようなデータは、引き継ぎが必要になる場面です。

  • ゲームの進行状況(例:ステージ、スコア)
  • プレイヤーのステータス(例:体力、装備など)
  • 音量設定やUIの状態
PR

変数共有の方法

変数共有の方法として、以下の3つの方法を紹介します。

  1. グローバル変数を使用する方法
  2. DontDestroyOnLoad()を使った変数共有
  3. PlayerPrefsを使った変数共有

1. staticな変数を使用する方法

グローバル変数は、Unityのどのシーンでも使用できる変数で、ゲーム全体で共有されます。グローバル変数を使用すると、前のシーンで設定した変数の値を次のシーンでも使用できます。

グローバル変数の宣言

グローバル変数を定義するには、次のようにします。クラス名は自由でOKです。

public static class GlobalVariables
{
    public static int score = 0;
}

シーンの変数の受け渡し

次に、グローバル変数を使用してシーン間で変数を共有する方法を説明します。まず、シーン間で変数の値を受け渡す必要があります。

変数を受け渡すには、次の例のように、変数の値をグローバル変数に設定する必要があります。

GlobalVariables.score = 100;

score変数に100を設定しています。

シーンの変数の使用

最後に、グローバル変数を使用してシーン間で変数の値を共有する方法を説明します。次の例では、score変数を使用して、シーンのスコアを表示する方法を示しています。

public class ScoreManager : MonoBehaviour
{
    public Text scoreText;

    void Start()
    {
        scoreText.text = "Score: " + GlobalVariables.score;
    }
}

上記の例では、ScoreManagerクラスのStartメソッドで、グローバル変数scoreを使用して、スコアを表示しています。

メリット

  • シンプルで導入が軽い
  • どのシーンからでも即アクセス可能

グローバル変数使用時の注意点

どのシーンからでも変数が参照できるため、変数の値を変更する場合は、その影響がどのシーンに及ぶのかを確認してから行うようにしましょう。

簡単だけど、グローバル変数が増えてくると管理が大変になりそう。。。

2. DontDestroyOnLoad()を使った変数共有

DontDestroyOnLoad()は、オブジェクトをシーン間で維持するために使用できる関数です。この方法を使用すると、シーンを切り替えてもオブジェクトが消えずに存在し続けます。

using UnityEngine;

public class GameManager : MonoBehaviour
{
    public static GameManager instance;
    public int score;

    void Awake()
    {
        if (instance == null)
        {
            instance = this;
            DontDestroyOnLoad(gameObject); 
        }
        else
        {
            Destroy(gameObject);
        }
    }
}

Awake()メソッドで、インスタンスがすでに存在する場合は、新しいインスタンスを破棄し、それ以外の場合は、自分自身をinstance変数に設定します。

これを行わないと、DontDestroyOnLoad()で指定したオブジェクトが、シーンを切り替えるたびに生成されることになります。

値の引き継ぎ方法

先ほど作成したGameManagerクラスには、score変数が含まれており、この変数はどのシーンでも使用できます。

例えば、次のようにシーンを切り替えると、スコアが引き継がれます。

using UnityEngine.SceneManagement;
using UnityEngine;

public class SceneSwitcher : MonoBehaviour
{
    public void SwitchToNextScene()
    {
        GameManager.instance.score = 100;
        SceneManager.LoadScene("NextScene");
    }
}

スコアが100に設定されて次のシーンに移ります。

メリット

  • MonoBehaviourとして動かせるため、コルーチンやInspector操作が可能
  • シーン切り替え時も破棄されない唯一のインスタンスとして機能

3. PlayerPrefsで永続的にデータ保持

PlayerPrefsは、Unityが提供するデータの保存機能です。簡易的なセーブ機能として使われます。

この方法はゲームを終了しても変数が保存されるよ!

PlayerPrefsを使うことで、シーン間で変数を共有することができます。PlayerPrefsを使った変数共有の実装例を示します。

まず、前のシーンで変数の値を保存します。以下の例では、”score”というキーに、スコアの値を保存しています。

int score = 100;
// scoreの保存
PlayerPrefs.SetInt("score", score); 

次に、次のシーンで保存したデータを読み込んで、変数に代入します。以下の例では、”score”というキーからスコアの値を読み込んで、score変数に代入しています。

保存されていなければ、0を返します。

// scoreの読み込み
int score = PlayerPrefs.GetInt("score", 0); 

メリット

  1. ゲームを終了してもデータが残る
    PlayerPrefsは「パソコンのレジストリ」や「スマホの内部ストレージ」に保存されるため、ゲームを閉じてもデータが消えません。
    例えば「ハイスコア」や「音量設定」などを次回起動時にもそのまま再現できます。
    👉 セーブ機能や設定保存にぴったりです。
  2. 実装がとても簡単
    たった1行で保存・読み込みできるので、初心者にも扱いやすいです。

注意点

  1. 保存できる型が限られている
    int(整数)、float(小数)、string(文字列)しか保存できません。
  2. セキュリティ面で弱い
    PlayerPrefsのデータは暗号化されていません。
    PCならレジストリ、スマホならアプリの内部データを直接編集されると、簡単に値を変えられてしまいます。

データの保存におすすめのアセット

Playerprefsでは、保存できる変数に限りがあったり、コードを書いたりと手間がかかり、セキュリティ面でも弱いことから、こちらのアセットが便利です。

PR

まとめ:どう使い分ける?

  • ユーザー設定やセーブデータを残したい → PlayerPrefs
  • シンプルな「ちょっとだけデータ共有」 → static変数
  • シーン間でゲーム管理を一貫させたい → Singleton

本記事では、シーン切り替え時に変数を共有する方法について、3つの具体的な実装例を紹介しました。これらの方法をうまく使い分けることで、シーン間でのデータの共有を効率的に行いましょう!