booooox
[Unity] MonoSingleton (모노싱글톤) 본문
반응형
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();
...
}
}
반응형
'Unity > System' 카테고리의 다른 글
[Unity] SoundManager (Audio Mixer) (0) | 2024.10.16 |
---|---|
[Unity] PopupManager (팝업 시스템) (1) | 2024.10.09 |
[Unity] 플레이어 상태 전환 (전략패턴) (0) | 2024.08.21 |
[Unity] Reverse Mask UI 팝업 (구멍 팝업) (0) | 2024.07.25 |
[Unity] Animation Event (시작, 끝 이벤트) (0) | 2024.07.23 |