본문 바로가기
게임 개발(유니티)/멋쟁이 사자처럼 3기_회고록

유니티 디자인 패턴- Singleton 패턴

by goraku97 2025. 1. 19.

싱글톤(Singleton)어떤 클래스의 인스턴스를 단 하나만 생성하도록 보장하는 디자인 패턴.


(유니티(Unity)에서는 주로 전역적으로 접근 가능한 객체를 싱글턴으로 만듬) 

(: 게임 매니저, 오디오 매니저, 스코어 매니저 등)를 구현할 때 사용

 

싱글톤은 특정 클래스의 인스턴스를 어디서든 접근할 수 있도록 하면서도

해당 클래스의 인스턴스가 여러 개 생성되지 않도록 제한함.

스크립트 해석

ChangeScene.cs
0.00MB

 

ChangeScene 스크립트

(UI버튼을 눌렀을 때, 빌드된 다음 씬으로 이동하는 기능을 구현)

 

SceneManager.GetActiveScene() : 현재 실행 중인 씬(Scene)을 반환

// 버튼 클릭 시 호출되는 메서드
public void LoadNextScene()
{
    // SceneManager.GetActiveScene() : 현재 실행 중인 씬(Scene)을 반환
    // 반환된 씬 객체의 빌드 인덱스(Build Index)를 가져옴.
    // 현재 씬의 빌드 인덱스에서 +1을 해서 "다음 씬"의 인덱스를 계산
    int nextSceneIndex = SceneManager.GetActiveScene().buildIndex + 1;
    // Unity에서 씬을 전환하는 함수
    SceneManager.LoadScene(nextSceneIndex);
}

 

DataManager.cs
0.00MB

 

DataManager 스크립트

(싱글톤(Singleton) 패턴을 사용하여 DataManager 클래스를 구현한 예제)

 

DontDestroyOnLoad() : 특정 게임 오브젝트(GameObject)가 씬(Scene)이 전환될 때 파괴되지

                                      않도록 설정하는 메서드

// instance가 null이라면(즉, 아직 초기화되지 않았다면), 현재 객체(this)를 instance에 저장
if (instance == null)
{
    instance = this;
    
    // 씬 전환 시에도 현재 GameObject가 파괴되지 않도록 설정
    // DontDestroyOnLoad 메서드는 루트 게임 오브젝트(root GameObject) 에서만 동작
    // Hierarchy 창에서 다른 게임 오브젝트의 자식이 아닌 최상위에 위치한 게임 오브젝트를 의미
    DontDestroyOnLoad(this.gameObject);
}

K_Singleton.cs
0.00MB

 

 

K_Singleton 스크립트

Unity에서 제네릭 싱글톤 패턴을 구현한 클래스.

싱글톤 패턴은 특정 클래스의 인스턴스를 단 하나만 유지하도록 보장.

이 코드는 Unity 환경에서 MonoBehaviour 기반의 싱글톤 클래스를 일반화(제네릭)하여 쉽게 재사용할 수 있도록 설계

 

transform.parent : 부모 오브젝트

transform.root : 루트 오브젝트(최상위 부모 오브젝트)

private void Awake()
{
   // 부모 오브젝트가 있거나, 루트 오브젝트가(최상위 부모 오브젝트)가 존재한다면 
   // 즉 이 오브젝트가 자식 오브젝트라면 하기의 코도를 실행
   if (transform.parent != null && transform.root != null)
   {
      // transform.root.gameObject는 현재 게임 오브젝트의 루트 오브젝트를 나타냄.
      // 루트 오브젝트를 DontDestroyOnLoad로 설정하면 루트 오브젝트와 그 자식 오브젝트들이 모두 씬 전환 후에도 유지
      DontDestroyOnLoad(transform.root.gameObject);
   }
   else
   {
      // 만약 루트 오브젝트라면, 이 게임 오브젝트(루트 오브젝트)를 파괴되지 않게함
      DontDestroyOnLoad(this.gameObject);
   }
   
}

 

GameManager1.cs
0.00MB

 

GameManager1 스크립트

K_Singleton<T> 제네릭 싱글톤 클래스를 확장한 GameManager1 클래스

 

Test1.cs
0.00MB

 

Test1 스크립트

DataManagerGameManager1의 싱글톤 인스턴스를 호출