【Unity】シーン切り替え時にデータ変数を共有・保持する方法3選

【PR】Unityアセットストアセール情報!

Unity Asset Storeにて、クイズゲームが簡単に作れるアセットTrivia Quiz Kitがクーポンコード「GAMEVANILLA」を入力することで無料でゲットできます!
6月20日(木) 23:59まで
クーポンコードの使い方はこちら

はじめに

Unityにおいてシーン切り替えを行う際には、シーンごとに別々のオブジェクトが生成され、変数の値が初期化されてしまうという問題があります。

本記事では、Unityでのシーン切り替え時に変数を共有する方法について、具体的な実装例を交えて紹介します。

シーンの遷移時に必要な情報

シーン遷移時には、前のシーンから引き継ぐ必要のある情報があります。例えば、以下のようなものがあります。

  • ゲームの進行状況
  • プレイヤーのステータス
  • 音量設定

変数共有の方法

変数共有の方法として、以下の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に設定されて次のシーンに移ります。

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つの具体的な実装例を紹介しました。これらの方法をうまく使い分けることで、シーン間でのデータの共有を効率的に行いましょう!

ゲーム作りがゼロから学べるおすすめ動画はこちら
Unity
umiをフォローする
umi studio blog
タイトルとURLをコピーしました