Unity/Study
유니티 싱글톤패턴에 대해서 #Singleton Pattern
VR하는소년
2024. 11. 8. 23:29
예전에도 싱글톤관련해서 블로그 포스팅을 작성한 적이 있습니다.
이번시간에는 싱글톤 패턴의 종류에는 무엇이 있는지 한 번 알아보겠습니다.
기본 싱글톤 패턴 (No MonoBehaviour)
public class GameManager
{
private static GameManager instance;
public static GameManager Instance
{
get
{
if (instance == null)
instance = new GameManager();
return instance;
}
}
}
가장 단순한 형태로, 클래스 내부에 정적 인스턴스를 생성하고 이를 통해 접근하는 방식입니다.
이 방식은 유니티의 MonoBehaviour를 상속받지 않는 클래스에서 주로 사용됩니다.
MonoBehaviour를 활용한 싱글톤 패턴
public class GameManager : MonoBehaviour
{
private static GameManager _instance;
public static GameManager Instance
{
get
{
if (_instance == null)
{
_instance = FindObjectOfType<GameManager>();
if (_instance == null)
{
GameObject obj = new GameObject("GameManager");
_instance = obj.AddComponent<GameManager>();
DontDestroyOnLoad(obj);
}
}
return _instance;
}
}
private void Awake()
{
if (_instance == null)
{
_instance = this;
DontDestroyOnLoad(gameObject);
}
else if (_instance != this)
{
Destroy(gameObject);
}
}
}
MonoBehaviour를 상속받는 클래스에서 싱글톤 패턴을 구현할 때 다음과 위와 같 방법을 사용합니다.
이 방식은 씬 전환 시에도 객체가 파괴되지 않도록 DontDestroyOnLoad를 사용하여 관리합니다.
DontDestroyOnLoad는 프로젝트 성격에 맞게 추가 및 제거하시면 됩니다.
제네릭 싱글톤 패턴
public class Singleton<T> : MonoBehaviour where T : MonoBehaviour
{
private static T _instance;
public static T Instance
{
get
{
if (_instance == null)
{
_instance = FindObjectOfType<T>();
if (_instance == null)
{
GameObject obj = new GameObject(typeof(T).Name);
_instance = obj.AddComponent<T>();
DontDestroyOnLoad(obj);
}
}
return _instance;
}
}
protected virtual void Awake()
{
if (_instance == null)
{
_instance = this as T;
DontDestroyOnLoad(gameObject);
}
else if (_instance != this)
{
Destroy(gameObject);
}
}
}
여러 클래스에서 싱글톤 패턴을 적용해야 할 경우, 제네릭을 활용하여 공통된 싱글톤 Base 클래스를 만들 수 있습니다.
이렇게 하면 각 클래스에서 Singleton<T>를 상속받아 간편하게 싱글톤 패턴을 구현할 수 있습니다.
제네릭 싱글톤을 사용하여 여러 클래스의 싱글톤을 용이하게 만들 수있습니다.