오늘은 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를 상속받았기 때문에 컴포넌트를 지닐 수 있게된다.