static 変数を使ってシーン間で変数共有

  • 27
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

シーン間で変数を共有する方法

シーン間で変数を共有する方法にはいくつかのやり方があるらしいが、最も手軽にできるのが、static 変数を利用する方法である。

サンプルコード

GameManagerGod クラスのメンバー変数であるnumberOfWinnumberOfLoseは、public staticで宣言しておくことで、シーンが変わってもゲームが起動している間は永続的に存在する変数となる。

(ちなみに、ゲームを終了した場合は、これらの変数は破棄される。ゲームが終了した後も永続的に変数を保存しておきたい場合は、ゲーム終了時にこれらの変数の値をファイルに書き出しておき、次のゲーム起動時にファイルから変数の値を読み込むことでできる。)

using UnityEngine;
using System.Collections;

/**
 * Define static variables to save variables between some scenes.
 */

public class GameManagerGod : MonoBehaviour {

        // 戦闘に勝った回数と負けた回数をシーン間で共有できるようにしておく。
    public static int numberOfWin = 0;
    public static int numberOfLose = 0;

    public static int getNumberOfWin () {
        return numberOfWin;
    }
    public static void addNumberOfWin (int n) {
        numberOfWin += n;
    }
    public static int getNumberOfLose () {
        return numberOfLose;
    }

    // Use this for initialization
    void Start () {
    }

    // Update is called once per frame
    void Update () {
    }
}

あとは、このクラスを、別のクラスで呼ぶだけ。

例えば、以下のシーンは、ゲームのオープニングシーン中のゲームオブジェクトで実行されるコードである。

using UnityEngine;
using System.Collections;

public class GUIOpening : MonoBehaviour {

    void OnGUI () {
        if ( GUI.Button (new Rect (10, 20, 100, 30), "Start battle") ) {
            Application.LoadLevel("Battle");
        }
        if ( GUI.Button (new Rect (10, 50, 100, 30), "Settings") ) {
        }

                // 戦闘に勝った回数と負けた回数を表示する。
        GUI.TextArea (new Rect (100, 100, 100, 30), (GameManagerGod.getNumberOfWin ()).ToString());
        GUI.TextArea (new Rect (100, 130, 100, 30), (GameManagerGod.getNumberOfLose ()).ToString());
    }

    // Use this for initialization
    void Start () {
    }

    // Update is called once per frame
    void Update () {
    }
}

戦闘シーンでも、戦闘の結果を見てGameManagerGodのstaticメソッドを更新する。
(以下の戦闘シーンは、Atack ボタンを5回押すと勝つ、という単純な戦闘)

using UnityEngine;
using System.Collections;

public class GUIBattle : MonoBehaviour {

    public int enemyHitPoint = 5;
    public enum Result {Unknown, Win, Lose};
    public Result result = Result.Unknown;

    void OnGUI () {
        if ( GUI.Button (new Rect (10, 20, 100, 30), "Atack") ) {
            if ( enemyHitPoint > 0 ) {
                enemyHitPoint--;
            }
        }
        if ( GUI.Button (new Rect (10, 50, 100, 30), "Defence") ) {
        }
        GUI.TextArea (new Rect (50, 100, 100, 30), enemyHitPoint.ToString());

        if (enemyHitPoint <= 0) {
            GUI.TextArea (new Rect(50, 150, 100, 30), "You win !!");
            result = Result.Win;
            //GameManagerGod gameManagerGod = GameManagerGod.loadGameManagerGod();
            Application.LoadLevel("Opening");
        }
    }

    void OnDestroy () {
        if (result == Result.Win) {
            GameManagerGod.addNumberOfWin (1);
        } else if (result == Result.Lose) {
                        // 実装面倒になったので省略
            //GameManagerGod.addNumberOfLose (1);
        }
    }

    // Use this for initialization
    void Start () {

    }

    // Update is called once per frame
    void Update () {

    }
}

注意点

上記の方法は非常にお手軽であるが、変数を保持しておくクラスを限定して利用したほうが良さそう。
というのもこの static 変数は、グローバル変数みたいなもんだから、どのクラスにどの static 変数が存在するか?が分からなくならないようにしたほうがいい。