오늘 챌린지반 과제진행중 제네릭 싱글톤에 대한 내용이 나와서 정리해 보았다.
제네릭 싱글톤? 제네릭 + 싱글톤을 합쳐서!
싱글톤 : 객체의 인스턴스가 오직 하나인 디자인패턴
Generic class : 데이터 형식을 일반화한 클래스
보통 게임프로젝트를 진행하면 다양한 Manager들을 통해 다양하게 작업을 진행한다. 이러다보면 무수히 많은 Manager들이 필요하게 되는데 문제는 각자 사용하는 매니저 방식이 다르게 되면 코드의 정리가 힘들어진다.
그래서 싱글톤은 제네릭화 시켜서 상속을 통해 다양한 매니저들을 구현한다.
using UnityEngine;
public class SingleTon<T> : MonoBehaviour where T : MonoBehaviour
{
private static T instance;
public static T Instance
{
get
{
// get instance of singleton
if (instance == null)
{
instance = FindObjectOfType<T>();
if (instance == null)
{
GameObject go = new GameObject
{
name = typeof(T).Name + "Managers"
};
instance = go.AddComponent<T>();
}
}
return instance;
}
}
public void Awake()
{
// make it as dontdestroyobject
if (instance == null)
{
instance = this as T;
DontDestroyOnLoad(this.gameObject);
}
else
{
Destroy(this.gameObject);
}
}
}
Instance 프로퍼티에서 FindObjectOfType를 통해 인스터스를 찾고 없다면 생성해주는 get 코드를 작성한다. 오브젝트를 생성후 AddComponent를 통해 스크립트까지 추가
Awake에선 씬을 이동해도 파괴하지 않도록 DontDestroyOnLoad를 사용해준다. 혹시나 있다면 오브젝트를 파괴후 유일성을 보장
Instance 프로퍼티와 상속에서 제네릭을 사용하고 싱글톤의 보장은 awake쪽에서 같이 처리한다.
이 싱글톤을 상속받아서 넘기기만 하면 끝!
public class AudioManager : Singleton<AudioManager>
{
static AudioManager instance;
}