유니티 게임매니저 싱글턴 구현 예제
앞선 시간에는 유니티의 필수요소인 게임매니저에 대해 설명해 드렸는데요.
글로만 설명을 하다보니 정확하게 와닿지 않으실것 같습니다. 그래서 이번 시간에는 게임매니저 싱글턴 구현 예제를 통해 알아보도록 하겠습니다.
GameManager 싱글턴 구현
GameManager에서 싱글턴을 구현한 부분을 먼저 살펴보고 다른 부분을 완성하겠습니다.
public static GameManger instance;
void Awake(){
if(instance == null)
{
instance = this;
}else{
Debug.LogWarning("두 개 이상의 게임 매니저가 존재합니다");
Destroy(gameObject);
}
}
GameManager 스크립트의 최상단에는 싱글턴 오브젝트를 할당하기 위한 static 선언된 GameManager 타입의 변수 instance가 있습니다. Awake() 메서드에서는 현재 오브젝트를 싱글턴 오브젝트로 만들고 instance에 할당하는 작업을 실행합니다. instance는 싱글턴이 될 GameManager 오브젝트가 저장될 변수입니다.
static으로 선언된 변수는 모든 오브젝트가 공유하는 단 하나의 변수가 됩니다. 이것을 다르게 생각하면 instance는 프로젝트에서 하나만 존재해야 하는 것입니다.
instance에는 GameManager 타입 오브젝트의 참조를 할당할 수 있습니다. 그런데 씬에 GameManager타입의 오브젝트가 100개 존재해도 instance는 메모리에 단 하나만 존재하므로 instance에 할당될 수 있는 GameManager 오브젝트도 단 하나뿐입니다.
즉, 싱글턴이 될 GameManager 오브젝트는 스스로를 instance에 할당합니다. 이 과정은 비어있는 왕좌를 경쟁적으로 차지하려는 과정으로 비유할 수 있습니다.
Awake() 메서드의 if문 블록에서는 instance가 비어 있다면 그곳에 자기 자신을 할당합니다.
만약 instance의 값이 null이라면 instance에 아직 어떠한 GameMannger 타입의 오브젝트도 할당되지 않은 상태입니다. 따라서 현재 Awake() 메서드를 실행하고 있는 GameManager 오브젝트가 this를 instance에 할당하여 스스로를 instance에 할당합니다. this는 오브젝트가 자기 자신을 가리키는 키워드로서 스스로에 대한 참조값이 출력됩니다.
이렇게 instance에 할당된 GameManager 오브젝트는 GameManager.instance로 즉시 접근할 수 있습니다.
GameManager 타입의 오브젝트는 씬에 단 하나만 존재해야 합니다. 어떠한 이유로 GameManager 오브젝트가 둘 이상 존재하는 경우 싱글턴이 된 GameManager 오브젝트 하나만 남기고 나머지 GameManager 오브젝트는 모두 파괴해야 합니다.
이어지는 else문 블록은 instance가 null이 아닌 경우에 실행됩니다. 즉, 자신이 아닌 다른 GameManager 오브젝트가 instance에 이미 할당된 경우입니다.
이 경우 경고 로그를 출력하고 싱글턴이 될 수 없는 자신의 게임 오브젝트를 Destory() 메서드로 파괴했습니다.