Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

booooox

[Unity] MonoSingleton (모노싱글톤) 본문

Unity/System

[Unity] MonoSingleton (모노싱글톤)

booooox 2024. 7. 22. 23:04
반응형

1. MonoSingleton : MonoBehaviour를 상속 받으면서 한 개의 인스턴스를 보장하는 싱글톤 패턴

2. 기대효과 : 

    1) 한 개의 인스턴스를 보장 하여 어디서든 접근 가능하다.

    2) 생성 된 이후 씬이 변하여도 삭제되지 않는다. ex) SoundManager, PopupManager 등 적용 가능

    3) 하이어라키에 넣지 않아도 해당 클래스가 없을 시 언제든 인스턴스로 생성 가능하다.

    4) 스크립트 뿐만 아니라 프리팹으로 생성 가능하다.

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

public class MonoSingleton<T> : MonoBehaviour where T : MonoBehaviour
    {
        protected MonoSingleton() { }
        private static T _instance = null;
        private static object lockObject = new object();
        private static bool isQuitting = false;

        public static T instance
        {
            get
            {
                lock (lockObject)
                {
                    if (isQuitting) return null;
                    // Get instance
                    _instance = (T)FindObjectOfType(typeof(T));

                    if (_instance == null) {
                        // Remove namespace, only script name
                        string[] typeName = typeof(T).ToString().Split('.');
                        // Get prefab
                        var typeObject = Resources.Load<T>("Prefabs/Singleton/"+ typeName[typeName.Length - 1]);
                        // Set instance
                        _instance = typeObject != null ? Instantiate(typeObject) : new GameObject().AddComponent<T>();
                        // Set Object Name
                        _instance.name = typeName[typeName.Length - 1];
                        // Don't Destroy OnLoad
                        DontDestroyOnLoad(_instance.gameObject);
                    }
                    return _instance;
                }
            }
        }

        public virtual void OnDestroy()
        {
            _instance = null;
        }

        public virtual void OnApplicationQuit()
        {
            _instance = null;
            isQuitting = true;
        }
    }

 

3. 사용법 : 상속 되는 MonoBehaviour 대신 MonoSingleton<ClassName> 을 적어준다.

public class SoundManager : MonoSingleton<SoundManager>
{
    ...
}

 

4. 주의점 : 부모인 MonoSingleton 클래스에 사용되는 함수은 ovrride를 사용하여 구현 하여야 한다.

public class SoundManager : MonoSingleton<SoundManager>
{
    public override void OnDestroy()
    {
        base.OnDestroy();
        ...
    }

    public override void OnApplicationQuit()
    {
        base.OnApplicationQuit();
        ...
    }
}
반응형