싱글톤 패턴
Unity를 통해 게임을 개발하면 여러 스크립트로 이루어진 게임 요소들을 GameManager 스크립트를 선언하여 관리하는 경우가 많다. 이 경우 다른 스크립트에서 GameManager에 접근하기 위해 인스턴스를 생성하곤 한다.
//GameManager.cs - 싱글톤 X
public class GameManager : MonoBehaviour
{
public void InitializeGame()
{
Debug.Log("게임이 초기화되었습니다.");
}
}
위와 같이 싱글톤 패턴을 사용하지 않은 GameManager.cs가 있다고 가정하자.
그리고 다른 스크립트 Example.cs에서 해당 스크립트에 접근해 InitializeGame 메서드를 실행하고자 한다면
코드는 다음과 같아야 한다.
// Example.cs
public class Example : MonoBehaviour
{
void Start()
{
GameManager gameManager = new GameManager();
gameManager.InitializeGame();
}
}
Example.cs의 Start 메서드에서 GameManager 인스턴스를 생성해 그 인스턴스를 통해 InitializeGame 메서드를 실행한 것이다.
이 외에도 Scene에 이미 생성된 GameManager 인스턴스를 찾아 접근하는 방식도 있다.
언뜻 보아 코드도 짧고 사용해도 무리가 없어 보이나, 프로젝트의 규모가 커질 경우 성능이 저하될 우려가 있다. 또한, 다른 스크립트를 작성할 때에도 매번 해당 인스턴스를 생성하거나 찾아야 하는 번거로움도 있으니 GameManager 클래스는 싱글톤 패턴을 적용하기에 알맞다.
싱글톤 패턴을 왜 써야 하는가?
그렇다면 이 싱글톤 패턴을 사용하였을 때의 장점이 무엇일까? 다음과 같다.
- 메모리 절약으로 인한 성능 개선
- 데이터 관리에 유리
첫 장점의 경우 이미 언급하였으니 넘어가고, 데이터 관리에 유리하다는 것은 어떤 의미일까?
// PlayerCondition.cs
public class PlayerCondition : MonoBehavior
{
public float hp;
public float mp;
// 싱글톤 O
}
위와 같은 PlayerCondition.cs에 싱글톤 패턴이 적용되어 있다고 가정하자. 그리고 플레이어가 스킬을 사용하여 mp를 소모하고 hp를 회복하는 코드를 작성하고자 한다면,
// Skill.cs
public class Skill : MonoBehavior
{
public void HealSkill()
{
PlayerCondition.Instance.mp -= [스킬 사용에 필요한 MP];
PlayerCondition.Instance.hp += [힐 하고 싶은 수치];
}
}
위와 같이 쓸 수 있다. 물론 실제 코드는 더 복잡하다. 간단히 보이기 위해 간략하게 적은 것이다. 별도의 인스턴스 생성 혹은 탐색 작업 없이 접근할 수 있다는 장점이 있다. 데이터 관리에 있어 번거로운 작업이 줄어드는 것이다.
싱글톤 패턴을 어떻게 적용하는가?
싱글톤 패턴을 적용하는 코드는 다음과 같다.
public class GameManager : MonoBehaviour
{
private static GameManager _instance;
public static GameManager Instance
{
get
{
--- 중략 ---
return _instance;
}
}
}
위와 같은 방식으로 적용하여 다른 스크립트에서 GameManager.Instance로 접근한다면 GameManager 스크립트에서 _instance를 제공해준다. 즉, get 메서드에 접근하게 되는 것이다. 중략 부분에 들어갈 스크립트는 GameManager 인스턴스가 Scene에 존재하는지 탐색하고, 존재하지 않다면 새로 생성하는 기능이 들어간다.
개발자는 게을러야 한다는 말이 있다. 이 말이 할 일을 미루고 놀기만 좋아해야 한다는 뜻이 아닌, 더욱 더 편한 방법을 추구해야 한다는 뜻이다. 싱글톤 패턴의 경우 프로젝트의 성능 개선에도 일조하나 데이터 관리 측면에서 개발자에게 편리함을 제공한다. 즉, 개발자에게 편한 방법이라는 뜻이다.
편한 방법이라고 남발해서는 안되겠다. 남발할 경우 코드의 유연성이 저하되는 등 여러 문제가 발생할 수 있다.
이 또한 오브젝트 풀링과 같이 적용 범위를 설정하는 것은 온전히 개발자의 몫으로 적절히 설정할 줄 알아야겠다.
'Today I Learned' 카테고리의 다른 글
[TIL][Unity] 오브젝트 충돌 시 효과음 출력 (0) | 2024.06.07 |
---|---|
[TIL][Unity] 인터페이스 (0) | 2024.06.05 |
[TIL][Unity] 오브젝트 풀링 (0) | 2024.06.03 |
[TIL][Unity] 직렬화 특강 (0) | 2024.05.30 |
[TIL][Unity] 트러블슈팅 - 움직이는 오브젝트에서 오디오 재생 (0) | 2024.05.29 |