ゲーム制作の際、キャラクターのHPや累積経験値など、複数のシーンで変数を共有する必要が出てくる場合があります。今回はそのような状況を想定し、複数のシーン間で変数を共有する方法を説明したいと思います。
準備
今回はマップ探索画面と戦闘画面でプレイヤーのHP情報を共有する場合を想定します。そこで先ずは探索用画面を想定したExpolreSceneと戦闘画面を想定したBattleSceneを作成し、各画面にシーン遷移用のボタンを用意しました。(下図参照)
複数のシーンで変数を共有する方法
方法はいくつかあるようですが、私は複数のシーンで変数を共有したい場合、publicでstaticなクラス&publicでstaticな変数を使用しています。その方法について下記で説明していきます。
STEP1:Pluginsフォルダの作成
StaticClassを用いるにはAssetsフォルダ直下のPluginsフォルダにそのクラスを定義したスクリプトを入れる必要があるらしいです。そのため、下図のようにAssetsフォルダ直下に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;
}
上記スクリプトのポイントは下記の通りです。
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");
}
}
また、戦闘画面では戦闘により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");
}
}
機能テスト
それでは最後に、ゲームを起動させ、処理が想定どおりに行われているか確認します。実際にExploreScene→BattleScene→ExploreSceneと移動した時のコンソールの結果は下図の通りです。探索画面でHP10の状態から戦闘画面でHP9になり、探索画面でHP9のままと、シーン間で変数情報が保持・共有されていることが確認できると思います。
今回は複数のシーンで変数を共有する方法について説明しましたが、いかがだったでしょうか。ゲームでは、所持金や所有アイテム等様々なシーンで情報を共有する必要のある変数が多くあリますので、この記事が少しでも皆様のゲーム制作の役に立てばと思います。
以上。
コメント