シングルトンとは
シングルトン(Singleton)は、指定したクラスのインスタンスが1つしか存在しないことを保証するデザインパターンの1つです。
プログラム上に1つしか存在しないので、GetComponentなどをせず、簡単にアクセスすることが出来ます。
実装
using UnityEngine;
using System;
//シングルトン親クラス(継承元)
public abstract class SingletonMonoBehaviour<T> : MonoBehaviour where T : MonoBehaviour
{
private static T instance;
//外部からアクセスされるためのプロパティ
public static T Instance
{
get
{
//インスタンスがなければ
if (instance == null)
{
//クラスの型を取得
Type type = typeof(T);
//自分自身をインスタンス化
instance = (T)FindObjectOfType(type);
//アタッチされていない時
if (instance == null)
{
Debug.LogError(type + " をアタッチしているGameObjectが存在しません");
}
}
return instance;
}
}
virtual protected void Awake()
{
// 他のゲームオブジェクトにアタッチされているか調べる
// アタッチされている場合は破棄する。
CheckInstance();
}
protected void CheckInstance()
{
//インスタンスが存在していなければ、自分自身をインスタンス化
if (instance == null) { instance = this as T; return; }
//自分自身なら何もしない
else if (Instance == this) { return; }
//自分自身を破棄する
Destroy(this);
return;
}
}
このコードは、シングルトン化させたいクラスに継承させるクラスとなります。シングルトンを使いたい場合は、このコードをプロジェクトに追加する必要があります。
使い方
SingletonMonoBehaviourをプロジェクトに追加する
先ほど作った、SingletonMonoBehaviourのスクリプトをプロジェクトに追加します。
シングルトン化させたいクラスに継承する
using UnityEngine;
//シングルトンクラスを継承したゲームマネージャークラス
public class GameManager : SingletonMonoBehaviour<GameManager>
{
public void DispDebugLog()
{
Debug.Log("アクセスできた!");
}
}
次に、シングルトン化させたいクラスに、SingletonMonoBehaviourクラスを継承させます。これで、GameManagerは、どこからでもアクセスできる状態になりました。
アクセスの方法
using UnityEngine;
//プレイヤークラス
public class Player : MonoBehaviour
{
private void Start()
{
GameManager.Instance.DispDebugLog(); //ゲームマネージャーにアクセス
}
}
アクセスする側は、GetComponentなどをしなくても、Instanceを呼び出すだけで、簡単にアクセスすることが出来ます。
注意点
シングルトンは一見便利なものですが、どこからでも簡単にアクセスできるということは、アクセス数が増えるごとに、依存関係が高まっていきます。つまり、GameManagerが突然消えたときに、エラー祭りとなってしまいます。
クラス同士の依存関係的に、直接アクセスするクラスと、しないクラスでしっかり管理する必要があります。
とはいっても、小規模のゲームを作る程度なら気にせず、まずは使ってみるのがいいと思います!