LoginSignup
33
35

More than 5 years have passed since last update.

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

Last updated at Posted at 2014-10-26

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

シーン間で変数を共有する方法にはいくつかのやり方があるらしいが、最も手軽にできるのが、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 変数が存在するか?が分からなくならないようにしたほうがいい。

33
35
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
33
35