【Unity基礎4】複数のシーンで変数を共有する

Unity基礎

ゲーム制作の際、キャラクターのHPや累積経験値など、複数のシーンで変数を共有する必要が出てくる場合があります。今回はそのような状況を想定し、複数のシーン間で変数を共有する方法を説明したいと思います。

準備

 

今回はマップ探索画面と戦闘画面でプレイヤーのHP情報を共有する場合を想定します。そこで先ずは探索用画面を想定したExpolreSceneと戦闘画面を想定したBattleSceneを作成し、各画面にシーン遷移用のボタンを用意しました。(下図参照)

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

 

方法はいくつかあるようですが、私は複数のシーンで変数を共有したい場合、publicでstaticなクラス&publicでstaticな変数を使用しています。その方法について下記で説明していきます。

この方法はpublicなクラスおよび変数を用いるため、どこからでもアクセスできて便利なのですが、反面、どこからでも内容が書き換えることが出来てしまいます。そのためこの方法は賛否両論あるようですので、そこはご注意ください。

STEP1:Pluginsフォルダの作成

StaticClassを用いるにはAssetsフォルダ直下のPluginsフォルダにそのクラスを定義したスクリプトを入れる必要があるらしいです。そのため、下図のようにAssetsフォルダ直下にPluginsフォルダを作成します。

Pluginsフォルダは優先的にコンパイルされるため、他クラスから参照ができるようです。

STEP2:プレイヤーのHP情報を保有するクラス(スクリプト)の作成

続いてプレイヤーのHP情報(共有したい情報)を保有するクラスを作成します。具体的には下図のように、Pluginsフォルダにクラスを定義するスクリプトを作成します。(ここではPlayerManagerという名前にしました。)

STEP3:スクリプトの編集

今度はSTEP2で作成したスクリプトを編集します。具体的にはクラスをpbilicでstaticなものにし、publicでstaticな変数hpを定義します。実際のスクリプトは下記の通りです。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//複数のシーンで共有する情報(HP)を管理するクラス
//MonoBehaviourは継承しないことに注意
public static class PlayerManager
{
    //プレイヤーのHPを説明のため10で初期化
    public static int hp=10;
}

上記スクリプトのポイントは下記の通りです。

6行目:クラスをpublicかつstaticなものにしています。
本クラスはオブジェクトにアタッチするようなものではないため、MonoBehaviourは継承しません。
9行目:プレイヤーのHPを管理する変数hpをpublicでstaticなものとして定義しています。また、説明のためhpを10に初期化しています。

STEP4:他のクラスからHP情報にアクセス

他クラスから上記方法で定義したHP情報にはPlayerManager.hp(PublicStaticClass名.アクセスしたい変数名)と記述することでアクセスできます。例えば今回作成した、ExploreScene(探索画面)でコンソールにプレイヤーHPを表示させるようにしたスクリプトは下記のようになります。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class GameManagerExploreScene : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        Debug.Log("ExploreScene");
        Debug.Log("プレイヤーのHP:" +  PlayerManager.hp);
    }
    //ボタンを押した際にBattleSceneへ移動するメソッド
    public void ClickGoToBattleScene()
    {
        SceneManager.LoadScene("BattleScene");
    }
}
11行目で実際にプレイヤーのHPにアクセスし、Debug.Logメソッドを用いて表示させています。

また、戦闘画面では戦闘によりHPが1減った事を想定し、下記のようなスクリプトを作成しました。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class GameManagerBattleScene : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        PlayerManager.hp -= 1;//戦闘でHPが1減ったこと事を想定した処理
        Debug.Log("BattleScene");
        Debug.Log("プレイヤーのHP:" + PlayerManager.hp);
    }
    //ボタンを押した際にExploreSceneへ移動するメソッド
    public void ClickGoToExploreScene()
    {
        SceneManager.LoadScene("ExploreScene");
    }
}
10行目がHPを1減らす処理で、12行目はHPを表示させる処理になります。

機能テスト

 

それでは最後に、ゲームを起動させ、処理が想定どおりに行われているか確認します。実際にExploreScene→BattleScene→ExploreSceneと移動した時のコンソールの結果は下図の通りです。探索画面でHP10の状態から戦闘画面でHP9になり、探索画面でHP9のままと、シーン間で変数情報が保持・共有されていることが確認できると思います。 

今回は複数のシーンで変数を共有する方法について説明しましたが、いかがだったでしょうか。ゲームでは、所持金や所有アイテム等様々なシーンで情報を共有する必要のある変数が多くあリますので、この記事が少しでも皆様のゲーム制作の役に立てばと思います。

以上。

-ゲームアプリ「HelloAnotherWorld」ダウンロードのお願い-

私が作成したゲームアプリ「HellowAnotherWorld」をダウンロードしていただけると嬉しいです。
有料ではありますが、ペットボトル飲料一本分程度の値段ですので、是非お願いします。
皆様にもメリットがあり、「このサイトで勉強すればこの程度のアプリであれば自分一人で作成できるようになる」という一つの目安にもなるかと思います。

-ゲームアプリ「HelloAnotherWorld」ダウンロードのお願い-

私が作成したゲームアプリ「HellowAnotherWorld」をダウンロードしていただけると嬉しいです。
有料ではありますが、ペットボトル飲料一本分程度の値段ですので、是非お願いします。
皆様にもメリットがあり、「このサイトで勉強すればこの程度のアプリであれば自分一人で作成できるようになる」という一つの目安にもなるかと思います。

スポンサーリンク
HelloAnotherWorld
HelloAnotherWorld
¥120
posted withアプリーチ
Unity基礎
ソフィーのUnity講座

コメント