Unity/Study

유니티 싱글톤패턴에 대해서 #Singleton Pattern

VR하는소년 2024. 11. 8. 23:29
 

두고두고 써먹는 싱글톤(SingleTon) 코드

싱글톤 패턴이란? Unity 싱글톤 패턴은 특정 클래스가 게임 수명 기간 동안 하나의 인스턴스만 갖도록 하기 위해 Unity 게임 개발에서 일반적으로 사용되는 디자인 패턴입니다. 이 패턴은 게임 내

wlsdn629.tistory.com

예전에도 싱글톤관련해서 블로그 포스팅을 작성한 적이 있습니다.

 

이번시간에는 싱글톤 패턴의 종류에는 무엇이 있는지 한 번 알아보겠습니다.


기본 싱글톤 패턴 (No MonoBehaviour)

public class GameManager
{
    private static GameManager instance;

    public static GameManager Instance
    {
        get
        {
            if (instance == null)
                instance = new GameManager();
            return instance;
        }
    }
}

가장 단순한 형태로, 클래스 내부에 정적 인스턴스를 생성하고 이를 통해 접근하는 방식입니다.

이 방식은 유니티의 MonoBehaviour를 상속받지 않는 클래스에서 주로 사용됩니다.

 


MonoBehaviour를 활용한 싱글톤 패턴

public class GameManager : MonoBehaviour
{
    private static GameManager _instance;

    public static GameManager Instance
    {
        get
        {
            if (_instance == null)
            {
                _instance = FindObjectOfType<GameManager>();
                if (_instance == null)
                {
                    GameObject obj = new GameObject("GameManager");
                    _instance = obj.AddComponent<GameManager>();
                    DontDestroyOnLoad(obj);
                }
            }
            return _instance;
        }
    }

    private void Awake()
    {
        if (_instance == null)
        {
            _instance = this;
            DontDestroyOnLoad(gameObject);
        }
        else if (_instance != this)
        {
            Destroy(gameObject);
        }
    }
}

MonoBehaviour를 상속받는 클래스에서 싱글톤 패턴을 구현할 때 다음과 위와 같 방법을 사용합니다.

이 방식은 씬 전환 시에도 객체가 파괴되지 않도록 DontDestroyOnLoad를 사용하여 관리합니다.

 

DontDestroyOnLoad는 프로젝트 성격에 맞게 추가 및 제거하시면 됩니다.


제네릭 싱글톤 패턴

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

    public static T Instance
    {
        get
        {
            if (_instance == null)
            {
                _instance = FindObjectOfType<T>();
                if (_instance == null)
                {
                    GameObject obj = new GameObject(typeof(T).Name);
                    _instance = obj.AddComponent<T>();
                    DontDestroyOnLoad(obj);
                }
            }
            return _instance;
        }
    }

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

여러 클래스에서 싱글톤 패턴을 적용해야 할 경우, 제네릭을 활용하여 공통된 싱글톤 Base 클래스를 만들 수 있습니다.

이렇게 하면 각 클래스에서 Singleton<T>를 상속받아 간편하게 싱글톤 패턴을 구현할 수 있습니다.

 

제네릭 싱글톤을 사용하여 여러 클래스의 싱글톤을 용이하게 만들 수있습니다.