気ままなUnityエンジニアブログ

新米Unityエンジニアが送る解説アウトプットブログです。Twitter : @UjinUnity

MENU

Unity シングルトン 今さらSingletonMonoBehaviour を作ってみた

スポンサーリンク

f:id:Wojtek:20191029225320j:plain

Unityでシングルトンクラス用の基底クラスを作成してみました

SingletonMonoBehaviour は 「MonoBehaviour」を継承したシングルトンクラスでありMonoBehaviourの特性も活用できる便利なシングルトンクラスとして多くの方々に使用されています。

私が作ったSingletonMonoBehaviourは以下の形式になっています。

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

//===============================================
//  デザインパターン : シングルトン
//===============================================

/// <summary>
/// MonoBehaviourを継承したシングルトンクラス
/// </summary>

// namespaceをつけてね
namespace Framework {

    public class SingletonMonoBehaviour<T> : BaseSingletonMonoBehaviour where T : BaseSingletonMonoBehaviour {

        //===============================================
        //  シングルトン機構
        //===============================================

        private static T mInstance;

        public static T Instance {
            get {
                // インスタンスを生成する
                if (mInstance == null) {

                    // テンプレートに合わせた名前のオブジェクトを生成する
                    GameObject obj = new GameObject (typeof (T).FullName);

                    // シーン遷移後も破棄されないオブジェクトに設定する
                    DontDestroyOnLoad (obj);

                    // インスタンスに生成したオブジェクトを設定する
                    mInstance = obj.AddComponent<T> ();

                    // 初期化処理
                    mInstance.Init ();
                }

                return mInstance;
            }
        }

        //===============================================
        //  メソッド
        //===============================================

        /// <summary>
        /// 自身のオブジェクトを削除する
        /// </summary>
        public static void OnDestroy () {

            // インスタンスが存在する場合
            if (mInstance != null) {
                // インスタンスオブジェクトを削除する
                Destroy (mInstance.gameObject);
                mInstance = null;
            }
        }
    }

    /// <summary>
    /// SingletonMonoBehaviourの基底クラス
    /// </summary>
    public class BaseSingletonMonoBehaviour : MonoBehaviour {

        /// <summary>
        /// 継承先の初期化処理
        /// </summary>
        protected virtual void mOnInit () { }

        /// <summary>
        /// 初期化処理
        /// </summary>
        public void Init () {
            // 継承先の初期化処理
            this.mOnInit ();
        }
    }
}

解説


まず「SingletonMonoBehaviour」の基底クラスになる「BaseSingletonMonoBehaviour」を作成しました。
こちらは「SingletonMonoBehaviour」クラスの継承先で初期化処理 を使うときに役立つかな〜と思い作成しました。

こちらは特別必要ではないので、いらない人は消してもらって構いません。


「SingletonMonoBehaviour」ではインスタンスを生成しています。
オブジェクトを作成し、DontDestroyOnLoad で破棄されない用にしています。

これでシーン遷移が起きても存在し続けます。