C#/Unity3D
[Unity3D] 싱글톤 패턴 (Singleton Pattern)
cmlee
2022. 2. 7. 20:08
1. Singleton 이란?
다른 클래스에서 공통적으로 많이 접근하는 클래스가 있을 경우 (ex GameManager)
해당 클래스의 인스턴스(실체)를 하나로 유지하여 프로젝트에서 클래스의 데이터를 유지하고 객체를 단일화한다.
2. Unity에서 Singleton을 사용하는 이유
Manager류의 게임을 관리하는 오브젝트를 생성할 때
인스턴스가 하나이기 때문에 데이터를 쉽게 유지할 수 있고,
정적 선언을 하기 때문에 그 유지된 데이터를 다른 클래스에서 쉽게 접근하여 사용이 가능하다.
3. 예제
public class GameManager : MonoBehaviour
{
// static으로 정적 선언하여 프로그램이 끝날 때까지 유지하고 private하여 다른 클래스에서 수정할 수 없게 한다
static GameManager _instance = null;
// public 선언하여 다른 클래스에서 접근할 수 있게 하고 get 속성을 통해 접근만 가능하게 한다
public static GameManager instance {
get {
if (_instance == null) {
_instance = new GameManager();
}
return _instance;
}
}
// MonoBehaviour를 상속받는 클래스가 인스턴스화 되는 과정을 막을 수 없으므로 Awake에서 null여부를 검사하여 예외처리를 한다
void Awake() {
// 인스턴스가 비어있을 경우(막 생성되었을 때) 인스턴스를 this로 지정한다
if (_instance == null) {
_instance = this;
}
// 인스턴스가 비어있지 않을 경우(씬 이동 같은 경우로 인해 MonoBehaviour가 호출되어 인스턴스가 재생성 될 때) 재생성된 오브젝트를 파괴해준다
else if (_instance != null) {
Destroy(this.gameObject);
}
// 씬 로드시 해당 오브젝트를 파괴하지 않아야 다음 씬에도 유지가 된다
DontDestroyOnLoad(this.gameObject);
}
}
4. 이외의 방법
이외에도 MonoBehaviour를 상속받지 않고 사용하는 방법도 있다.
이 경우 하이어라키에 있는 인스턴스를 신경쓰지 않아도 되는 장점이 생긴다.
즉, 씬 이동시 인스턴스가 재생성 되는 과정을 신경쓰지 않아도 되니 Awake에서 다시 검사해주는 과정이 필요가 없다.
하지만, 말 그대로 메모리에만 존재하고 하이어라키에는 보이지 않아 인스펙터로 시각적으로 정보를 확인할 수 없다.
개발하는 입장에서 헷갈릴 수 있어 자주 사용하는 방법은 아니다.