싱글톤 패턴이란?
싱글톤 패턴은 클래스의 인스턴스를 하나만 생성하고,
그 인스턴스를 어디서든 접근할 수 있도록 전역적인 접근점을 제공하는 패턴입니다.
게임에서 GameManager, AudioManager, UIManager처럼 한 개만 존재해야 하는 객체를 만들 때 주로 사용됩니다.
구현
유일성 보장: 추가 인스턴스 생성을 막아야 하므로 Awake()에서 중복을 제한합니다.
전역 접근: public static 속성을 사용해 언제 어디서든 접근할 수 있게 합니다.
기본 형태
public class GameManager : MonoBehaviour
{
public static GameManager Instance { get; private set; }
void Awake()
{
if (Instance == null)
{
Instance = this;
}
else
{
Destroy(gameObject); // 중복 방지
}
}
public void GameStart()
{
Debug.Log("Game Started!");
}
}
사용 예시
public class GameManagerUser : MonoBehaviour
{
void Start()
{
GameManager.Instance.GameStart();
}
}
확장형 싱글톤 패턴
싱글톤을 여러 매니저 클래스에 사용할 경우, 매번 같은 코드를 반복해야 하는 단점이 있습니다.
이를 해결하기 위해 제너릭(Generic) 을 활용한 확장형 싱글톤 패턴을 사용할 수 있습니다.
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();
instance = obj.AddComponent<T>();
}
}
return instance;
}
}
private void Awake()
{
if (instance == null)
{
instance = this as T;
DontDestroyOnLoad(gameObject);
}
else if (instance != this)
{
Destroy(gameObject);
}
}
}
public class GameManager : Singleton<GameManager>
{
public void GameStart()
{
Debug.Log("Game Started!");
}
}
Singleton<T> 클래스를 한 번 만들어두면,
다른 매니저 클래스들은 상속만으로 싱글톤 기능을 바로 사용할 수 있어
코드 중복을 줄이고 유지보수가 쉬워집니다.