유니티 C# 싱글턴 오브젝트


게임 내에서 클래스 인스턴스들은 여러개 생성된다.

몬스터, 아이템만 봐도 하나의 씬에 여러개 존재 할 수 있다.


하지만 게임 매니저, 스코어, 오디오, 저장 등을

관리하는 몇몇 클래스들은 유일한 독립체로 존재해야 한다.




하나의 클래스 인스턴스만 존재하게 되며 그보다

많은 인스턴스를 만들지 않는다. 하나보다 많은

인스턴스를 가지는 것은 모순적인 부분이 발생하거나

오브젝트의 역할을 망가뜨리고 쓸모없어질 수도 있다.

이런 종류의 오브젝트를 싱글턴이라 부른다.


싱글턴은 대게 여러 씬에 걸쳐 지속적으로 유지되는 오브젝트이다.




싱글턴 기본 요소

항상 메모리에 클래스 인스턴스가 하나만 존재해야 한다.


tip!

이처럼 씬 간 유지되는 오브젝트는 자식 없는 빈 게임오브젝트처럼

동작에 필요한 기본 컴포넌트로만 구성해 가볍게 만들어진다.

씬을 전환할 때 중요한 필수 데이터만 살아남도록 하는 전략이다.







위 클래스 인스턴스는 이제 씬이 전환되어도 사라지지 않는다.

하지만 게임의 씬이 순차적으로 진행되리라 보장되진 않는다.

따라서 이 매니저클래스가 생성된 씬으로 다시 오게 된다면

매니저 클래스 인스턴스가 두개가 생기게 되고, 문제가 발생한다.


싱글턴으로 만들어주자.







유일한 인스턴스(싱글턴)일 뿐만 아니라 모든 인스턴스에

공유가되는 변수가 되었다. 이 변수는 get 멤버만을

가지고 있는 읽기 전용 프로퍼티를 통해 외부에서 접근 가능하다.




tip!

Awake()와 Start()

Awake()는 항상 오브젝트 생성 시에 호출된다.

Start()는 게임오브젝트가 활성화되는 첫번째 프레임에

호출된다. 만약 게임오브젝트가 비활성화된 씬에서

시작되었다면 오브젝트가 활성화되어 있더라도

Start()는 호출되지 않는다.

호출 순서 Awake() -> Start()




트랜스폼 컴포넌트를 변수에 캐싱하려면

Start()보다는 Awake()를 쓰는 것이 좋다.

일반적으로 Start() 이벤트가 일어날 때엔

오브젝트에 대한 모든 지역 참조들이

이미 할당되어 유효하다고 가정된다.




+ Recent posts