오늘은 게임개발종합반 1, 2주차 강의를 들었다.
1, 2주차 강의는 유니티에 대한 아주 기초적인 내용들로 이루어져있었는데, 그 중에서 앞으로 가장 많이 사용하고 중요한 개념인 GameManager
와 Singleton
에 대해서 정리해보려한다.
유니티에서 C# script의 클래스명을 GameManager
로 지정하면 일반적인 C# script의 모양이 아니라 톱니바퀴 모양으로 나온다. 그만큼 게임에서 중요한 요소이고, 이 클래스를 안 만드는 프로젝트가 없기 때문에 유니티에서도 특별하게 취급해주는 것 같다.
그렇다면 GameManager
는 무슨 일을 하는가 ?
그건 우리 개발자가 어떻게 만드느냐에 따라 다르겠지만, 일반적으로 전반적인 게임의 로직을 총괄한다거나 설정을 저장하고 불러온다거나, UI와 데이터를 동기화하는 작업등을 이 클래스에서 처리한다.
이 GameManager
는 굳이 여러번 생성될 필요가 없기도 하다. 전지전능한 관리자는 보통 한명이면 충분하니까 여러 개의 인스턴스가 생성되지 않게 Singleton
으로 구현한다.
Singleton
이란 디자인패턴
중의 하나이다. 프로그래밍에서의 디자인패턴
이란 개발에서 자주 나타나는 과제를 해결하기 위한 방법 중 하나로, 과거의 소프트웨어 개발 과정에서 발견된 설계의 노하우를 축적하여 이름을 붙여, 이후에 재이용하기 좋은 형태로 특정의 규약을 묶어서 정리한 것이다.
그 중에서 Singleton
패턴은 간단하게 말해서 언제 어디서나 누구나 접근 가능한 단 하나의 객체
라고 생각하면 될 것 같다.
장점
1. 단 하나의 객체만을 사용하므로 추후에 다른 객체에서 접근을 해도 메모리의 낭비가 없다.
2. 전역 인스턴스를 사용하므로 다른 클래스끼리의 데이터 공유가 쉽다.
단점
1. 객체지향의 원칙에 위배된다. 클래스끼리의 의존성이 높아지므로 남용해선 안된다.
Singleton
의 구현은 보통 간단하지 않은데, 유니티에서는 제법 간단하게 구현할 수 있다.
public class GameManager : MonoBehaviour
{
public static GameManager instance;
void Awake()
{
instance = this;
}
유니티의 Awake()
메서드는 애플리케이션이 실행 됐을 때 모든 이벤트 메서드들 중에서 가장 처음 실행된다. 따라서 이때 public static
으로 선언한 instance
변수에 자기 자신을 넣어주게 되면, GameManager
의 단 하나의 인스턴스가 instance
변수에 들어간다 !
만약 이래도 여러 개의 인스턴스가 생길 수 있으므로, if (instance == null)
을 추가해서 instance
변수가 비어 있을 때만 할당을 해주거나, get
프로퍼티를 이용하는 방법도 있겠다.