シーン間で変数を共有する方法
シーン間で変数を共有する方法にはいくつかのやり方があるらしいが、最も手軽にできるのが、static 変数を利用する方法である。
サンプルコード
GameManagerGod クラスのメンバー変数であるnumberOfWin
とnumberOfLose
は、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 変数が存在するか?が分からなくならないようにしたほうがいい。