Unityでシーンを切り替えたとき、「スコアがリセットされてしまった」「設定が引き継がれない」「進行状況が消える」といった悩みはありませんか?本記事では、増え続けるUnity初心者のそんな「困った!」を解決するために、シーンをまたいでデータを保持・共有する3つの方法を、実際に使えるコード付きで、丁寧に解説します。
はじめに:データを引き継ぐ必要性とは?
Unityでは、シーンごとに新たなオブジェクトが生成されるため、変数は基本的にリセットされます。以下のようなデータは、引き継ぎが必要になる場面です。
- ゲームの進行状況(例:ステージ、スコア)
- プレイヤーのステータス(例:体力、装備など)
- 音量設定やUIの状態
変数共有の方法
変数共有の方法として、以下の3つの方法を紹介します。
- グローバル変数を使用する方法
- DontDestroyOnLoad()を使った変数共有
- 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);
メリット
- ゲームを終了してもデータが残る
PlayerPrefsは「パソコンのレジストリ」や「スマホの内部ストレージ」に保存されるため、ゲームを閉じてもデータが消えません。
例えば「ハイスコア」や「音量設定」などを次回起動時にもそのまま再現できます。
👉 セーブ機能や設定保存にぴったりです。 - 実装がとても簡単
たった1行で保存・読み込みできるので、初心者にも扱いやすいです。
注意点
- 保存できる型が限られている
int
(整数)、float
(小数)、string
(文字列)しか保存できません。 - セキュリティ面で弱い
PlayerPrefsのデータは暗号化されていません。
PCならレジストリ、スマホならアプリの内部データを直接編集されると、簡単に値を変えられてしまいます。
データの保存におすすめのアセット
Playerprefsでは、保存できる変数に限りがあったり、コードを書いたりと手間がかかり、セキュリティ面でも弱いことから、こちらのアセットが便利です。
まとめ:どう使い分ける?
- ユーザー設定やセーブデータを残したい → PlayerPrefs
- シンプルな「ちょっとだけデータ共有」 → static変数
- シーン間でゲーム管理を一貫させたい → Singleton
本記事では、シーン切り替え時に変数を共有する方法について、3つの具体的な実装例を紹介しました。これらの方法をうまく使い分けることで、シーン間でのデータの共有を効率的に行いましょう!