TIL(2024,08,26)제네릭 싱글톤

김보근·2024년 8월 26일

Unity

목록 보기
70/113
post-thumbnail

Today I Learned : Unity에서 제네릭 싱글톤 패턴 구현

제네릭 싱글톤 패턴 개요

  • 제네릭 싱글톤 패턴은 Unity에서 전역적으로 접근 가능한 하나의 인스턴스만을 유지할 수 있도록 하는 디자인 패턴이다.
  • 제네릭 타입을 활용해서 다양한 컴포넌트를 싱글톤으로 쉽게 구현을 할 수 있다.

코드 설명

클래스 정의

public class Singleton<T> : MonoBehaviour where T : Component
  • Singleton 클래스는 T 라는 제네릭 타입을 받아들이며, 이 타입은 Component를 상속받아야 한다.
  • 이로 인해 T 는 Unity의 MonoBehaviour를 상속받는 모든 클래스가 될 수 있다.

정적 인스턴스 변수

private static T _instance;
  • T 타입의 싱글톤 인스턴스를 저장하는 정적 변수로, 내 모든 인스턴스가 이 변수를 공유한다.

Instance 프로퍼티

public static T Instance
{
    get
    {
        if (_instance == null)
        {
            _instance = FindObjectOfType<T>();

            if(_instance == null)
            {
                GameObject obj = new GameObject();
                obj.name = typeof(T).Name;
                _instance = obj.AddComponent<T>();
            }
        }
        return _instance;
    }
}
  • Instance 프로퍼티는 싱글톤 인스턴스를 반환하고 인스턴스가 아직 생성되지 않았다며느 새로운 인스턴스를 생성하고 반환한다.
  • 먼저 FindObjectOfType<T>()를 사용해 씬에서 T 타입의 오브젝트를 찾고 , 없을 경우 새로운 GameObject를 생성하여 T 타입의 컴포넌트를 추가한다.

Awake 메서드

public void Awake()
{
    if( _instance == null )
    {
        _instance = this as T;
        DontDestroyOnLoad(gameObject);
    }
    else
    {
        Destroy(gameObject);
    }
}
  • Awake 메서드는 인스턴스가 처음 생성될때 호출.
  • 인스턴스가 처음 생성된 경우 해당오브젝트를 씬이 변경되어도 파괴되지 않도록 DonDestroyOnLoad를 호출한다.
  • 이미 인스턴스가 존재한다면, 새로 생성된 오브젝트는 파괴

전체 코드

public class Singleton<T> : MonoBehaviour where T : Component
{
    private static T _instance;

    public static T Instance
    {
        get
        {
            if (_instance == null)
            {
                _instance = FindObjectOfType<T>();

                if(_instance == null)
                {
                    GameObject obj = new GameObject();
                    obj.name = typeof(T).Name;
                    _instance = obj.AddComponent<T>();
                }
            }
            return _instance;
        }
    }

    public void Awake()
    {
        if( _instance == null )
        {
            _instance = this as T;
            DontDestroyOnLoad(gameObject);
        }
        else
        {
            Destroy(gameObject);
        }
    }
}

제네릭 싱글톤 패턴의 장점

  • 전역 접근 : 프로젝트 어디서든지 동일한 인스턴스에 접근가능.
  • 생성 관리 : 인스턴스가 이미 존재할 경우 추가 생성을 막아 메모리 낭비를 줄인다.
  • 씬 간 인스턴스 유지 : DontDestroyOnLoad 를 통해 씬 전환이 일어나도 인스턴스를 유지한다.

사용 예시

  • GameManager라는 클래스를 싱글톤으로 만들고 싶을때
public class GameManager : Singleton<GameManager>
{
    // GameManager의 내용
}
  • 이후 GameManager.Instance를 통해 어디서든지 GameManager 인스턴스에 접근이 가능하다.

느낀 점

  • 제네릭 싱글톤 패턴을 통해 다양한 매니저 클래스들을 더 효율적으로 관리할 수 있을 것 같다.
  • 특히, 씬 전환이 빈번한 프로젝트에서 유용하게 활용될 수 있을 것으로 보인다. 앞으로 이 패턴을 다양한 상황에 적용해보며 더 깊이 이해해보겠다.
profile
게임개발자꿈나무

0개의 댓글