추상화 싱글톤 만들어 상속 받아 사용하기
보통 매니저클래스에 싱글톤을 많이 사용한다.
매니저들이 많아지면 싱글톤이 그 만큼 많아지기도 하고 겹치는 코드가 계속해서 생기기도 한다.
또 이에 따라 전역 클래스가 많아진다.
이를 하나의 싱글톤을 추상화 클래스로 만들어 제네릭타입으로 다른 타입을 모두 받아 단일 인스턴스로 접근할 수 있게 해주자.
제네릭 클래스 T를 사용해 싱글톤을 만들어주자.
T는 반드시 singleton를 상속받도록 제한을해준다.
나머지는 기본적인 싱글톤 구조를 만들어주고,인스턴스가 없다면 create메소드로 생성 부분은 따로 빼주었다.
public abstract class Singleton<T> : MonoBehaviour where T : Singleton<T>
{
private static T _instance = null;
public static T Instance
{
get
{
if (_instance == null)
Create();
return _instance;
}
}
Create메소드
인스턴스가 없다면, FindObjectsOfType()로 씬에 존재하는 모든 T 타입의 객체를 찾도록 해준다.
또 같은 타입의 객체가 여럿 있다면, 첫 번째 객체만 사용하고 나머지는 파괴하도록 해준다.
없는 경우에는 게임오브젝트를 생성하고 T 컴포넌트를 추가해준다.
protected static void Create()
{
if (_instance == null)
{
T[] objects = FindObjectsOfType<T>();
if (objects.Length > 0)
{
_instance = objects[0];
for (int i = 1; i < objects.Length; ++i)
{
if (Application.isPlaying)
Destroy(objects[i].gameObject);
else
DestroyImmediate(objects[i].gameObject);
}
}
else
{
GameObject go = new GameObject(string.Format("{0}", typeof(T).Name));
_instance = go.AddComponent<T>();
}
}
}
마지막으로 라이프사이클 함수들을 상속받도록 virtual로 선언해주면 끝이난다.
Awake에는 인스턴스가 있는지 있다면 파괴하고 없다면 사라지지 않도록 해준다.
protected virtual void Awake()
{
Create();
if(_instance != this)
{
Destroy(gameObject);
}
else
{
DontDestroyOnLoad(this);
}
}
protected virtual void OnEnable(){}
protected virtual void Start(){}
protected virtual void Update(){}
protected virtual void FixedUpdate(){}
protected virtual void LateUpdate(){}
protected virtual void OnDisable(){}
protected virtual void OnDestroy()
{
_instance = null;
}
싱글톤 개선버전 잘 이용해보자.