📗

【Unity】SingletonMonoBehaviourについて

2024/08/29に公開

はじめに

初めての方も、そうでない方もこんにちは!
現役ゲームプログラマーのたむぼーです。
自己紹介を載せているので、気になる方は見ていただければ嬉しいです!

今回は
 SingletonMonoBehaviour
について紹介します

https://zenn.dev/tmb/articles/1072f8ea010299

SingletonMonoBehaviourとは

SingletonMonoBehaviourは、シングルトンパターンを用いて1つのインスタンスのみを生成し、全シーンで共通して使用するMonoBehaviourクラス

使い方

using UnityEngine;
using Utils;

namespace Example
{
    public class ExampleManager : SingletonMonoBehaviour<GameManager>
    {
        protected override void Initialize()
        {
            // 初期化処理
            Debug.Log("GameManager Initialized");
        }

        // 他のメソッドやプロパティを追加
        public void DoSomething()
        {
            Debug.Log("Doing something...");
        }
    }
}
namespace Example
{
    public class ExampleClass
    {
        void Start()
        {
            ExampleManager.Instance.DoSomething();
        }
    }
}

スクリプト

SingletonMonoBehaviour.cs
using UnityEngine;

namespace Utils
{
    public class SingletonMonoBehaviour<T> : MonoBehaviour where T : MonoBehaviour
    {
        static private T _instance;
        static readonly private object _lockObject = new object();
        static private bool _isApplicationIsQuitting = false;

        /// <summary>
        /// インスタンス
        /// </summary>
        static public T Instance
        {
            get
            {
                if (_isApplicationIsQuitting)
                {
                    return null;
                }

                lock (_lockObject)
                {
                    if (_instance == null)
                    {
                        _instance = (T)FindObjectOfType(typeof(T));
                        if (_instance == null)
                        {
                            return null;
                        }
                    }
                    return _instance;
                }
            }
        }

        /// <summary>
        /// 起動時
        /// </summary>
        virtual protected void Awake()
        {
            if (_instance == null)
            {
                _instance = this as T;
                DontDestroyOnLoad(gameObject);
                Initialize();
            }
            else if (_instance != this)
            {
                Destroy(gameObject);
            }
        }

        /// <summary>
        /// 破壊時
        /// </summary>
        virtual protected void OnDestroy()
        {
            if (_instance == this)
            {
                _isApplicationIsQuitting = true;
            }
        }

        /// <summary>
        /// 初期化
        /// </summary>
        virtual protected void Initialize()
        {
            // 処理なし
        }
    }
}

Discussion