오늘 수준별 학습 시간에 나온 문제를 가지고 기존 프로젝트에 있던 Manager들에 Singleton 클래스를 상속 하여 반복적인 코드를 줄여보는 시간을 가지려고 한다.
일단 바로 시작 하자.
public class AudioManager : Monobehaviour
{
private static AudioManager _instance;
public static AudioManager Instance { get { Init(); return _instance; } }
private static void Init()
{
if (_instance == null)
{
// GameManager 동적 생성
GameObject go = new GameObject { name = "AudioManager" };
_instance = go.AddComponent<AudioManager>();
DontDestroyOnLoad(go);
}
}
// ...
}
이런식으로 Manager별로 각각 Singleton 형태를 만들어주는 단순한 소스로 구현 했는데, Manager가 하나가 아니고 여러개로 늘어나다 보니.. Singleton 구현 부분이 계속 겹치게 되는 소스코드를 하나만 들어서 제너릭과 상속 개념으로 바꾸고자 했다.
Singleton<T> 클래스를 만들어준다.public class Singleton<T> : MonoBehaviour where T : MonoBehaviour
{
private static T _instance;
public static T Instance { get { Init(); return _instance; } }
private static void Init()
{
if (_instance == null)
{
string name = typeof(T).Name;
// Manager 동적 생성
GameObject go = new GameObject { name = name };
_instance = go.AddComponent<T>();
DontDestroyOnLoad(go);
}
}
}
public class AudioManager : Singleton<AudioManager>
{
// 아래 주석된 코드는 더 이상 필요가 없다.
/*
private static AudioManager _instance;
public static AudioManager Instance { get { Init(); return _instance; } }
private static void Init()
{
if (_instance == null)
{
// GameManager 동적 생성
GameObject go = new GameObject { name = "AudioManager" };
_instance = go.AddComponent<AudioManager>();
DontDestroyOnLoad(go);
}
}
/*
//...
}
이런식으로 사용하게 되면 굳이 static Instance;를 매번 구현하지 않아도 기존 방식 그대로 사용 가능 하다!
꾸준학습에서 유용한 정보를 제공 받아서 아주 만족스럽다.