2024-06-25

게임을 관리하기 위해, 여러 매니저들이 존재한다.
개발자는
사운드 효과를 관리하는 SoundManager,
데이터를 관리하는 DataManager,
전반적인 게임 시스템을 관리하는 GameManager 등을 통해
게임을 관리한다.
그동안 여러 매니저들을 사용하는 방식으로 싱글톤 패턴을 사용해왔다.
싱글톤 패턴이란, 런타임 동안 메모리에 오직 하나의 인스턴스만 존재한다는 것을 의미한다.
public class GameManager : MonoBehaviour
{
static public GameManager Instance;
if(Instance == null)
{
Instance = this;
DontDestroyOnLoad(gameObject);
}
else
{
Destory(gameObject);
}
}
각각의 매니저를 싱글톤으로 처리하여,
매니저들이 상시 존재하고 접근을 편리하게 하는 방식이다.
SoundManager.Instance.SetVolume();
DataManager.Instance.LoadData();
GameManager.Instance.Resume();
하나만 싱글톤으로 만들고 매니저들을 연결하는 방식이다.
모든 매니저를 관리하는 매니저만을 싱글톤으로 구현하고,
나머지 모든 매니저들을 필드에 만들어두는 방식이다.
GameManager 만 MonoBehaviour 를 상속받고,
다른 매니저들은 MonoBehaviour 를 상속 받지 않는다.
따라서, 각각의 매니저들은 Awake 나 Start 가 아닌 초기화 함수를 따로 만들어주어야 한다.
public class GameManager : MonoBehaviour
{
static public GameManager Instance;
UIManager UIManager = new UIManager();
DataManager DataManager = new DataManager();
SoundManager SoundManager = new SoundManager();
ResourceManager ResourceManager = new ResourceManager();
private void Awake()
{
Instance = this; // 싱글톤 처리
}
private void Start()
{
// 매니저들을 대신 초기화해줘야함 -> 다른 매니저는 MonoBehaviour 를 상속 받지 않음
UIManager.Init();
DataManager.Init();
SoundManager.Init();
ResourceManager.Init();
}
}
GameManager.Instance.SoundManager.SetVolume();
GameManager.Instance.DataManager.LoadData();
GameManager.Instance.Resume();
| 개별 싱글톤 | 단일 싱글톤 |
|---|---|
| 각자 초기화하느라 처리 속도가 느려짐 | 초기화 속도가 더 빠름 |
| 유니티 생명주기 함수 활용 가능 | 개별 매니저는 MonoBehaviour가 없어 생명주기 함수 활용 불가 |
| 메모리 파편화 | 메모리 파편화 X |
| 각 매니저에서 접근할 때, 코드가 간결함 | 하이어라키 상 매니저가 하나만 존재 |
개별 싱글톤 방법을 사용하며, 싱글톤을 너무 남용하는 것이 아닌가 하는 걱정을 했었는데,
개별 싱글톤 방법과 단일 싱글톤 방법에 대해 알아보며
각각의 장단점과 특징에 대해 알아볼 수 있었다.