Unityでシーン切り替え後、前のシーンで使用していた変数やデータは
参照することができなくなります。
シーン切り替え後にも、データを参照したい場合は、
1.内部でデータを保持する(static クラスに値を保持する)
2.外部でデータを保持する(外部にファイルを保存する)
主にこの2つの方法が考えられます。
今回は1つ目の方法。
内部でデータを保持するやり方を説明していきます。
注意
今回説明する内部でデータを保持するやり方は、
ゲーム起動中(実行中)にのみ値の保持が可能です。
ゲームを終了した場合、その値は削除され、
次に起動するときには、前回保持した値を再び参照することはできません。
こうゆうときに使用する
ゲーム起動中のみ、値を保持する今回のやり方ですが、
どのような時に使用するのか例を上げます。
・セーブデータ以外のちょっとしたデータを保持しておきたいとき。
(例:ステージ選択シーンでステージを選択
→その選択したステージ番号を別シーンで参照したい など)
(ゲーム終了時に消えても問題のないデータ。)
・WebGL形式で、仮のセーブ機能を実装できる。
(例:プレイシーンのリザルトを保持
→リザルトシーンでそのデータを参照 など)
(WebGLでセーブするには、自身のサーバーにデータを保存するなど
以外にセーブができないので、リザルトで結果を確認したいときのみ
などに使用できる。)
内部でデータを保持する方法
スクリプト
以下のスクリプトを作成します。
スクリプトの作成方法は通常通りで大丈夫です。
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement; using UnityEngine.UI; // ★どのシーンからでもアクセスできるクラス★ public static class GameScore { // どのシーンからでもアクセスできる変数 public static int Score_ = 0; public static float time_ = 0.0f; } /*以下は普通のクラス*/ public class CommonData : MonoBehaviour { // Start is called before the first frame update void Start() { } // Update is called once per frame void Update() { // マウスの左クリックが押されたら if (Input.GetMouseButtonDown(0)) { // ★Staticのエリアの変数に1を加算★ GameScore.Score_ += 1; // ★Staticのエリアの変数を参照★ Debug.Log(GameScore.Score_.ToString()); } } }
解説①
クラスの宣言
// ★どのシーンからでもアクセスできるクラス★ public static class GameScore { // どのシーンからでもアクセスできる変数 public static int Score_ = 0; public static float time_ = 0.0f; }
スクリプトにおける上記箇所が、
シーン間でデータを保持しておく処理部分です。
「static」 という部分が、クラス・シーン関係なくどこでもアクセス
できるようになる魔法の言葉です。
staticの詳細についての明記は避けます。
public static class ~~~~
{}
→このクラス(class)は、どのシーンからでもアクセスできます。
public static int ~~~
→この変数(int)は、どのシーンからでもアクセスできます。
public static float ~~~
→この変数(float)は、どのシーンからでもアクセスできます。
解説②
static クラスの参照方法
// マウスの左クリックが押されたら if (Input.GetMouseButtonDown(0)) { // ★Staticのエリアの変数に1を加算★ GameScore.Score_ += 1; // ★Staticのエリアの変数を参照★ Debug.Log(GameScore.Score_.ToString()); }
staticクラスに参照する場合、
staticクラス.変数名
で参照する。
どこからでも参照可能、上書き可能。
staticクラスを宣言したスクリプトファイルと同じファイルで
参照するコードを記載していますが、
別のスクリプトファイルからでも同様にアクセス可能です。
実行例
実行例
① TitleSceneでクリックするたびに、staticクラスの変数カウント+1。
そのカウントは、テキストで表示。
② SpaceキーでPlaySceneへ移動。
③ PlaySceneから、①でカウントしていた変数にアクセスし、
テキストで表示。
④ SpaceキーでTitleSceneへ移動。
上記の① ~ ④を繰り返す処理を行った実行例です。
データの保持、参照は全てstatic クラスを使用しています。
以下に使用したスクリプトを共有します。
TitleSceneのスクリプト
① シーン StaticTitleScene を作成。
② 以下スクリプトを作成。
③ Textを作成。
④ ②のスクリプトを空オブジェクトにアタッチ。
⑤
[SerializeField]
Text score_;
には、Scene上でスクリプトにテキストをアタッチしてください。
⑥ File → Build Settings からシーンの登録を忘れずに。
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement; using UnityEngine.UI; // ★どのシーンからでもアクセスできるクラス★ public static class GameScore { // どのシーンからでもアクセスできる変数 public static int Score_ = 0; public static float time_ = 0.0f; } /*以下は普通のクラス*/ public class CommonData : MonoBehaviour { // TitleSceneのテキスト(staticクラスのScore_を入れるテキスト) [SerializeField] Text score_; // Start is called before the first frame update void Start() { // Staticの変数から値を参照する score_.text = GameScore.Score_.ToString(); } // Update is called once per frame void Update() { // Spaceキーを押されたら if (Input.GetKeyDown(KeyCode.Space)) { // シーン切り替え(PlaySceneへ) SceneManager.LoadScene("StaticPlayScene"); } // マウスの左クリックが押されたら if (Input.GetMouseButtonDown(0)) { // ★Staticのエリアの変数に1を加算★ GameScore.Score_ += 1; // テキストを更新 score_.text = GameScore.Score_.ToString(); } } }
PlaySceneのスクリプト
① シーン StaticPlayScene を作成。
② 以下スクリプトを作成。
③ Textを作成。
④ ②のスクリプトを空オブジェクトにアタッチ。
⑤
[SerializeField]
Text score_;
には、Scene上でスクリプトにテキストをアタッチしてください。
⑥ File → Build Settings からシーンの登録を忘れずに。
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement; using UnityEngine.UI; public class StaticPlayScene : MonoBehaviour { // PlaySceneのテキスト(staticクラスのScore_を入れるテキスト) [SerializeField] Text score_; // Start is called before the first frame update void Start() { // Staticの変数から値を参照する score_.text = GameScore.Score_.ToString(); } // Update is called once per frame void Update() { // Spaceキーを押されたら if (Input.GetKeyDown(KeyCode.Space)) { // シーン切り替え(TitleSceneへ) SceneManager.LoadScene("StaticTitleScene"); } } }
おわりに
今回は、Unityのシーン間でデータ・変数を保持する方法を説明しました。
この記事が何かのお役に立てれば幸いです。
Web(frog blend)
・公式HP「ふろっぐぶれんどのゲームセンター」
・外部リンクまとめ