Unityやってるワン

Unityでのゲーム開発を備忘録として記事にしていきます

継承することでシングルトンパターンで実装できるクラスを作ってみた

前回シングルトンパターンで管理系のクラスを作成する記事を書きました。
シングルトンでマネージャーっぽいクラスを作ってみた - Unityやってるワン


でも、シングルトンのパターンで実装するたびにstaticでインスタンスを保持する処理を用意するのはちょっと面倒です。
なので継承することでシングルトンクラスとして実装することができるクラスを作ってみました。
このクラスを継承すれば、シングルトンのパターンを毎回用意する必要がなくなりそうです。


SingletonClass.cs

using UnityEngine;

public abstract class Singleton<TSingleton> : MonoBehaviour
{
    private static TSingleton m_instance;

    public static TSingleton Instance
    {
        get
        {
            if (m_instance == null)
            {
                // シングルトンオブジェクト生成
                var components = new[]{ typeof( TSingleton ) };
                GameObject obj = new GameObject(typeof(TSingleton).Name, components);
                m_instance = obj.GetComponent<TSingleton>();
                // シーン遷移時に破棄させないようにする
                DontDestroyOnLoad(obj);
            }
            return m_instance;
        }
    }

    protected Singleton () { }
}

シングルトンパターンのクラスSingletonClass.csを作ってみました。
ジェネリックでシングルトンパターンのクラスを宣言しています。
実際に使用する場合は以下のような形になります。


PointManager.cs

using UnityEngine;

public class PointManager : Singleton<PointManager>
{
    private int m_point = 0;

    private PointManager () { }

    public void AddCount (int _point = 1)
    {
        m_point += _point;
    }

    public int Count { get { return m_point; } }
}

Singletonクラスを継承して得点を管理するPointManager.csを作りました。
これで、毎回シングルトンで実装する手間が省けそうですね。


PointManagerは以下のような形で利用できます。

PointManager.Instance.AddCount();
PointManager.Instance.AddCount(10);
Debug.Log("現在の得点:" + PointManager.Instance.Count);

f:id:nsdeveloperman:20170708164929p:plain