はじめに
Unityにおいてシーン切り替えを行う際には、シーンごとに別々のオブジェクトが生成され、変数の値が初期化されてしまうという問題があります。
本記事では、Unityでのシーン切り替え時に変数を共有する方法について、具体的な実装例を交えて紹介します。
シーンの遷移時に必要な情報
シーン遷移時には、前のシーンから引き継ぐ必要のある情報があります。例えば、以下のようなものがあります。
- ゲームの進行状況
- プレイヤーのステータス
- 音量設定
変数共有の方法
変数共有の方法として、以下の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に設定されて次のシーンに移ります。
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では、保存できる変数に限りがあったり、コードを書いたりと手間がかかるため、おすすめのアセットがあります。
おわりに
本記事では、シーン切り替え時に変数を共有する方法について、3つの具体的な実装例を紹介しました。これらの方法をうまく使い分けることで、シーン間でのデータの共有を効率的に行いましょう!