[Unity]유니티로 배우는 싱글톤 패턴
싱글톤(Singleton) 패턴
싱글톤 패턴은 가장 유명한 디자인 패턴 중 하나로, 단 하나의 유일한 객체를 만들기 위한 코드 패턴을 의미한다. 사용자가 여러 번 객체를 생성하더라도 오직 하나의 인스턴스만 존재하도록 하여, 프로그램 내에서 하나로 공유하며 사용하게 된다.
게임을 만들다 보면 비교적 중요한 역할을 맡게 되는 오브젝트를 구현하게 된다. 보통 게임의 씬(Scene)을 관리하거나, UI, 데이터 같은 요소들을 직접 관리하는 게임 매니저를 예로 들 수 있다. 이러한 게임 매니저는 게임 시작부터 끝까지, 전범위적으로 맡은 부분을 지속적으로 관리하는 중요한 역할을 수행한다.
싱글톤을 사용하는 이유
예를 들어, 내 유니티 게임 프로젝트에 관리자 역할을 맡기기 위해 게임 매니저 오브젝트를 만들고자 한다. 게임 매니저에서는 현재 게임의 스코어, 플레이어 사망 여부, 플레이 타임같은 중요한 요소들을 관리한다. 이러한 요소들은 프로젝트 내에 두 개이상 존재할 필요가 없으며, 다수의 매니저 오브젝트에서 동시 접근, 수정 시 에러가 발생할 가능성이 높다. 따라서 게임 매니저는 프로그램 내에 하나만 존재해야 한다. 또한, 매니저라 불리는 오브젝트들을 어느 곳에서도 사용할 수 있는 편의성을 제공해야한다. 예를 들어, 마리오 게임 처럼 플레이어가 코인을 먹었을때 스코어를 추가하는 기능을 구현하려면, 플레이어 오브젝트에서 스코어를 관리하는 게임 매니저에 쉽게 접근할 수 있어야 한다.
정리하자면, 게임 매니저는 아래 두 조건을 만족해야 한다.
- 매니저 오브젝트는 단 하나만 존재(유일성)
- 어디서든 쉽게 접근이 가능해야 함(접근성)
이는 싱글톤 패턴을 사용하기 매우 적합한 조건이다.
게임 매니저 구현
싱글턴 패턴을 구현할 때는 정적(static) 변수의 특성을 활용한다. 그리고 사용자가 직접 인스턴스에 접근하지 못하게 접근용 프로퍼티를 따로 만들어주는 것이 좋다.
public class GameManager : MonoBehaviour
{
private static GameManager instance; //싱글톤이 할당될 변수
//싱글톤 접근용 프로퍼티
public static GameManager Instance{
get{
if(instance == null){
return null;
}
return instance;
}
}
이제 게임 매니저에서 관리할 변수와 외부에서 호출될 메서드를 구현해준다.
private int score = 0; //현재 게임 점수
private bool isGameOver = false; //게임 오버 상태
void Awake(){
if(instance != this){
Destroy(gameObject);
}
}
public void AddScore(int newScore){
if(!isGameOver){ //게임오버 상태가 아닐 시
score += newScore;
}
}
}
위 코드에서 Awake() 메서드는 게임 시작시 한번만 실행되는 유니티 전용 메서드이다. 현재 씬의 싱글톤 오브젝트에 다른 게임매니저가 할당되어 있다면, 자신을 파괴함으로서 유일성을 유지한다.
public class PlayerCtrl : MonoBehaviour
{
public void GetCoin(){ //코인 획득
GameManager.Instance.AddScore(1);
}
}
위 코드에서는 플레이어가 코인을 획득했을 시 게임매니저의 AddScore() 메서드를 호출하여 스코어 값을 증가시키는 것을 보여준다. 이처럼 매우 편리하게 게임 매니저에 접근할 수 있다는 점이 싱글톤 패턴의 장점이다.
물론 싱글톤 패턴이 장점만 존재하는 것은 아니다. 싱글톤 패턴을 구현할 때는 정적(static)변수로 선언하기 때문에, 많이 사용할 수록 메모리에 부정적으로 할당되는 데이터가 많아지므로 메모리를 잡아먹는 심각한 요소가 될 수도 있다.
댓글남기기