シングルトンなゲーム管理オブジェクトの作り方

さて一通り下準備ができたところで、今回はゲームの裏方部分から先に作ってしまいます(実は今回のチュートリアルのメインはこの裏方部分なのです)。まずはゲーム進行を管理する「GameManager」オブジェクトを作っていきましょう。

それでユニティちゃんパルクールを実際に作った方は分かると思いますが、ユニティちゃんパルクールの時のGameManagerには問題があります。それは何かというと、各シーンにGameManagerが配置されていると通しプレイをしたときにGameManagerが複数存在することになりバグッてしまうのです。そのため、通しプレイをするときにはタイトル画面だけにGameManagerを配置して、他のシーンのGameManagerは削除しておく必要がありました(※個別のステージをテストプレイするときは改めてGameManagerを置き直す必要がある)。ステージ数が少なければいいのですが、これではステージが増えてくるととても面倒なことになりそうだというのは明白です。

そもそもゲーム進行に必要なオブジェクトは1つだけあれば良いので、できれば「そのゲームオブジェクトが1つしか存在しないことを保証する」ような仕組みが欲しいものです(複数あったら他を自動的に削除してくれたほうが楽ですよね)。そこで、今回はゲーム管理オブジェクトなどでよく使われる「シングルトン」という仕組みを導入してみましょう。

スポンサーリンク

「シングルトン」について

「シングルトン」とは、先ほども書いたように「そのゲームオブジェクトがシーンに1つしか存在しないことを保証する」ための仕組みです。この仕組みを実現するために、「SingletonMonoBehaviour」というクラスを新たに作ります。ではソースコードを見てみましょう。

using UnityEngine;

public class SingletonMonoBehaviour<T> : MonoBehaviour where T : MonoBehaviour
{
	private static T instance;

	public static T Instance
	{
		get
		{
			if (instance == null)
			{
				instance = (T)FindObjectOfType(typeof(T));

				if (instance == null)
				{
					Debug.LogError(typeof(T) + "がシーンに存在しません。");
				}
			}

			return instance;
		}
	}

}

処理の内容は単純で、あるクラスTのインスタンスがシーンに存在するかどうかをチェックしているだけです。

スポンサーリンク

シングルトンなGameManagerの作り方

「SingletonMonoBehaviour」ができたら、それを継承することでシングルトンにしたいクラスを作ります。

シングルトンなゲーム管理オブジェクトを作る

空のゲームオブジェクトを作り、名前を「GameManager」・タグを「GameController」にしたら次のC#スクリプトをアタッチしてください。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GameManager : SingletonMonoBehaviour<GameManager>
{

	[SerializeField]
	int maxScore = 999999;

	int score = 0;

	public int Score
	{
		set
		{
			score = Mathf.Clamp(value, 0, maxScore);
		}
		get
		{
			return score;
		}
	}

	public void Awake()
	{
		if (this != Instance)
		{
			Destroy(gameObject);
			return;
		}

		DontDestroyOnLoad(gameObject);
	}

	void Start()
	{
		
	}

	void Update()
	{
        
	}

}

Awake()メソッド内の処理については、もしこのインスタンスが既にあるインスタンスではなかったら削除する処理と、ゲームオブジェクトがシーンをまたいでも削除されないようにする処理(DontDestroyOnLoad)を書いています。

なお今はまだゲーム進行に関する具体的な処理は書いていないのですが、あとで追加していきます。

次のページ→コインの作り方