アフィリエイト広告を利用しています。
時より不適切な広告が表示される場合があります。
運営者側でブロックするなど、できる限りの対処を心がけております。
あらかじめご了承ください。
-PR-

【Unity入門】簡単にシーン間でデータ・変数を保持する方法!1分からの簡単Unity入門!

 

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「ふろっぐぶれんどのゲームセンター」

frog-blend-game-center.com

 

・外部リンクまとめ

frog-blend.hatenablog.com

 

PR