본문 바로가기
C#

[C#][Unity] 싱글톤 패턴(Singleton) 설명

by teamnova 2021. 7. 26.

안녕하세요! 이번 포스팅은 유니티에서의 싱글톤패턴에 대한 포스팅 입니다!

 

싱글톤이란 프로그래밍 디자인 패턴 중 게임에서 가장 빈번하게 쓰이는 패턴중 하나인데요!

 

싱글톤 패턴오직 한 개의 클래스 인스턴스만을 갖도록 보장하고, 이에 대한 전역적인 접근점을 제공합니다!

 

쉽게 설명 하자면 한개의 클래스 인스턴스를 갖는걸 보장하고,  전역적인 접근점을 제공한다는 것은 어디에서나 해당 클래스의 인스턴스에 접근할 수 있다는 뜻입니다!

 

더쉽게 말해서 어디에서나 가져다 쓸 수 있는 클래스를 제공하게 된다! 라고 하면 좋겠네요!

 

유니티에 적용을 해보자면 게임을 관리하는 매니저(Manager) 계열의 클래스가 싱글톤패턴에 적합하다고 할 수 있겠습니다.

 

그럼 싱글톤에 대한 요약은 여기 까지 하고 싱글톤이 어떤 역할을 할지 요약해 보자면.

 

싱글톤의 역할

 

1. 게임 시스템에서 전체를 관장

2. 게임 시스템의 전역 변수

3. 씬 로드 시 데이터가 파괴되지 않고 유지

4. 여러 오브젝트가 접근 할 수 있는 데이터 활용

 

등 게임이 동작함에 있어서 전반적인 데이터를 쉽게 조율하는 역할을 할 수 있는게 싱글톤 패턴입니다!

 

유니티에서 싱글톤패턴을 사용하지 않은 채로 다른씬을 로드하게 되면 모든 객체와 데이터 들이 파괴되는데요. 

싱글톤 패턴을 사용하면 다른 씬을 로드해도 파괴되지 않은 채로 데이터를 가져갈 수 있게 됩니다!

 

코드와 예제를 통해 더 자세히 알아 보도록 하겠습니다!

 

우선 유니티에서  Hierarchy창에 Create Empty를 눌러 Objact를 생성 후 이름을 GamaManager 로 바꿔 보도록 하겠습니다. 

그리고 GameManager의 Inspector 창에서 new script를 생성해 주겠습니다! 이름은 GameManager로 할게요!

짜잔 Script가 생성 된걸 볼 수 있습니다! GameManager 같은 경우 사람들이 많이사용하는 개념이기 때문에 유니티 상의 Script도 다른 Script들의 아이콘 과는 좀 다르게 생겼다는걸 볼 수 있습니다!

 

이제 스크립트를 편집 해 보도록 하겠습니다! 

 

 

예제는 아래의 스틱코드의 글을 참고 하였습니다!

https://stickode.com/detail.html?no=1214 

 

스틱코드

 

stickode.com

예제에 나와있는 코드들을 그대로 사용해 보도록 하겠습니다! 이 코드는 GameManager를 static으로 선언하고 만약 GamaManager 스크립트를 가진 다른 오브젝트가 존재하면 모든 오브젝트를 파괴한다는 예제입니다!

여러 GamaManager를 남용 할 수 없게 만드는 기본적인 안전장치 코드라고 보면 좋겠네요!

 

이제 이렇게 만들어진 스크립트 안의 변수 또는 함수들은 

 

GameManager.instance.(변수 혹은 함수명)


이 간단한 코드를 통해서 어디서든 불러내서 사용 할 수 있게됩니다! 정말 쉽죠?

 

하지만 이런 간편한 싱글톤 패턴으로 도 주의해야 할 점이 있는데요 그것은!!

 

 

주의 할 점!

쉽게 사용 가능하다 보니 모든 데이터나 객체를 이곳에 마구잡이로 넣어서 사용하게 될 수 있는데 그러면 안되요!

접근이 쉬운만큼 마구잡이로 사용하다 보면 그 간편함이 규모가 커질수록 더 복잡한 상황을 만들어 낼 수 있어요! 

그래서 나중에 재정리 할 떄가 더 고통스러운 상황이 생깁니다! 

꼭! Script는 용도에 맞게 분리해서 사용하도록 해요~!

 

이번 싱글톤 포스팅은 여기 까지 하겠습니다!