[TIL] 47일 차 - MonoSingleton을 만들어보자

ChangBeom·2025년 4월 4일

TIL

목록 보기
48/53
post-thumbnail

오늘은 MonoSingleton이라는 클래스를 만들어서 상속받은 클래스를 Singleton패턴으로 관리하면서, MonoBehavior를 상속받도록 만들 예정이다.


유니티로 게임개발을 할 때 Singleton패턴으로 관리하는 매니저들이 정말 많다. 대부분의 매니저들은 컴포넌트가 필요없지만 사운드 매니저, 팝업 매니저 같이 컴포넌트를 가지고 있어야하는 매니저들이 존재한다. 이때 사용할 수 있는 것이 MonoSingleton 이다.

using UnityEngine;

public class MonoSingleton<T> : MonoBehaviour where T : MonoBehaviour
{
    private static T _instance = null;

    public static T Instance
    {
        get
        {
            if(_instance == null)
            {
                _instance = FindObjectOfType<T>();
                if(_instance == null)
                {
                    GameObject obj = new GameObject();
                    obj.name = typeof(T).Name;
                    _instance = obj.AddComponent<T>();
                }
            }
            return _instance;
        }
    }

    [SerializeField] protected bool isDonDestroy = false;

    protected virtual void Awake()
    {
        if(_instance == null)
        {
            _instance = this as T;
            if (isDonDestroy)
            {
                DontDestroyOnLoad(this.gameObject);
            }
        }
        else
        {
            Destroy(this.gameObject);
        }        
    }
}

코드를 보면 사실 그냥 Singleton패턴이랑 다를게 없는데, 핵심은 MonoBehaviour를 상속받아서 만든다는 것이다. 이렇게 만든 MonoSingleton 클래스를 상속받아서 생성한 클래스들은 Singleton패턴으로 한 Scene에 하나만 존재하게 되며, MonoBehaviour를 상속받았기 때문에 컴포넌트를 지닐 수 있게된다.

0개의 댓글