はじめに
Unityにおいてシーン切り替えを行う際には、シーンごとに別々のオブジェクトが生成され、変数の値が初期化されてしまうという問題があります。
本記事では、Unityでのシーン切り替え時に変数を共有する方法について、具体的な実装例を交えて紹介します。
シーンの遷移時に必要な情報
シーン遷移時には、前のシーンから引き継ぐ必要のある情報があります。例えば、以下のようなものがあります。
- ゲームの進行状況
- プレイヤーのステータス
- 音量設定
変数共有の方法
変数共有の方法として、以下の3つの方法を紹介します。
- グローバル変数を使用する方法
- DontDestroyOnLoad()を使った変数共有
- PlayerPrefsを使った変数共有
1. staticな変数を使用する方法
グローバル変数は、Unityのどのシーンでも使用できる変数で、ゲーム全体で共有されます。グローバル変数を使用すると、前のシーンで設定した変数の値を次のシーンでも使用できます。
グローバル変数の宣言
グローバル変数を定義するには、次のようにします。クラス名は自由でOKです。
シーンの変数の受け渡し
次に、グローバル変数を使用してシーン間で変数を共有する方法を説明します。まず、シーン間で変数の値を受け渡す必要があります。
変数を受け渡すには、次の例のように、変数の値をグローバル変数に設定する必要があります。
score
変数に100を設定しています。
シーンの変数の使用
最後に、グローバル変数を使用してシーン間で変数の値を共有する方法を説明します。次の例では、score
変数を使用して、シーンのスコアを表示する方法を示しています。
上記の例では、ScoreManager
クラスのStart
メソッドで、グローバル変数score
を使用して、スコアを表示しています。
グローバル変数使用時の注意点
どのシーンからでも変数が参照できるため、変数の値を変更する場合は、その影響がどのシーンに及ぶのかを確認してから行うようにしましょう。

簡単だけど、グローバル変数が増えてくると管理が大変になりそう。。。
2. DontDestroyOnLoad()を使った変数共有
DontDestroyOnLoad()は、オブジェクトをシーン間で維持するために使用できる関数です。この方法を使用すると、シーンを切り替えてもオブジェクトが消えずに存在し続けます。
Awake()メソッドで、インスタンスがすでに存在する場合は、新しいインスタンスを破棄し、それ以外の場合は、自分自身をinstance変数に設定します。
これを行わないと、DontDestroyOnLoad()で指定したオブジェクトが、シーンを切り替えるたびに生成されることになります。
値の引き継ぎ方法
先ほど作成したGameManagerクラスには、score変数が含まれており、この変数はどのシーンでも使用できます。
例えば、次のようにシーンを切り替えると、スコアが引き継がれます。
スコアが100に設定されて次のシーンに移ります。
3. PlayerPrefsを使った変数共有
PlayerPrefsは、Unityが提供するデータの保存機能です。簡易的なセーブ機能として使われます。

この方法はゲームを終了しても変数が保存されるよ!
PlayerPrefsを使うことで、シーン間で変数を共有することができます。PlayerPrefsを使った変数共有の実装例を示します。
まず、前のシーンで変数の値を保存します。以下の例では、”score”というキーに、スコアの値を保存しています。
次に、次のシーンで保存したデータを読み込んで、変数に代入します。以下の例では、”score”というキーからスコアの値を読み込んで、score変数に代入しています。
保存されていなければ、0を返します。
おすすめアセット
Playerprefsでは、保存できる変数に限りがあったり、コードを書いたりと手間がかかるため、おすすめのアセットがあります。
おわりに
本記事では、シーン切り替え時に変数を共有する方法について、3つの具体的な実装例を紹介しました。これらの方法をうまく使い分けることで、シーン間でのデータの共有を効率的に行いましょう!