Help us understand the problem. What is going on with this article?

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

More than 5 years have passed since last update.

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

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

jxpress
技術力で「ニュースの産業革命」を起こす。言語処理・データ解析分野の専門家が集まる、News Techベンチャー。
https://jxpress.net/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした