DevDino

[게임 디자인 패턴] Singleton 본문

Unity/디자인 패턴

[게임 디자인 패턴] Singleton

데브다이노 2024. 4. 8. 20:49

 

Singleton

싱글톤 패턴의 주요 목표는 유일성을 보장하는 것입니다. 런타임 동안 메모리에 오직 하나의 인스턴스만 존재해야 합니다. 오직 한 번만 생성되어야 하며, 같은 유형의 인스턴스를 발견하면 없앱니다. 

 

싱글톤 예제

using UnityEngine;

public class GameManager : MonoBehaviour
{
    // 싱글톤 instance 선언 
    private static GameManager instance;
    public static GameManager Instance { get { return instance; } }

    private void Awake()
    {
        // 이미 인스턴스가 존재하면 
        if (instance)
        {
            // 자신 삭제 
            Destroy(gameObject);
            return;
        }

        // 인스턴스를 자신으로 만듦 
        instance = this;
        DontDestroyOnLoad(gameObject);
    }
}

 

다음과 같이 제네릭 클래스를 만들어서 상속받아 사용할 수 있습니다. 

using UnityEngine;

public class Singleton<T> : MonoBehaviour where T: Component
{
    private static T instance;
    
    public static T Instance
    {
        get
        {
            if(instance == null)
            {
            	// 지정한 타입의 첫 번째로 로드된 오브젝트 검색
                instance = FindObjectOfType<T>();
				
                // 없다면 새로운 GameObject 생성
                if (instance == null)
                {
                    GameObject obj = new GameObject();
                    obj.name = typeof(T).Name;
                    instance = obj.AddComponent<T>();
                }
            }
            return instance;
        }
    }
    private virtual void Awake()
    {
        if(instance == null)
        {
            instance = this as T;
            DontDestroyOnLoad(gameObject);
        }
        else
        {
            Destroy(gameObject);
        }
    }
}

 

 

싱글톤은 유니티 개발자가 많이 사용하는 디자인 패턴 중 하나이지만, 장단점이 분명하기 때문에 조심해서 사용해야 합니다.

전역 접근점을 만들어 전역에서 접근이 가능하며 공유 자원에 동시 접근을 제어할 수 있지만 사용이 쉬워 잘못된 습관이 들 수 있으며 유닛 테스트가 어려워 질 수도 있습니다. 

디자인을 선택할 때 항상 유지보수 및 확장, 테스트 가능 여부를 염두에 두어야 합니다!

 

저는 주로 게임 내 하나만 존재하는 게임 매니저, UI 매니저, BGM 매니저 등에 사용하였습니다.