ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 유니티 싱글톤 패턴 구현 및 축약 (unity c# singleton)
    개발/unity 2023. 7. 6. 12:05

    Unity에서 Singleton 패턴은 흔히 쓰이는 패턴이다. 싱글톤 패턴에 대한 내용은 자세하게 다루지는 않을 것이다. 코드부터 보도록 하자.

     

    [싱글톤 기본 구현]

    public class SceneManager : MonoBehaviour
    {
        private static SceneManager instance;
        
        public static SceneManager GetInstance()
        {
        	if (instance != null) return instance;
            
            // null인 경우
            instance = GameObject.FindAnyObjectByType<SceneManager>();
            // 찾지 못하면 생성
            if (instance == null)
            {
                GameObject singletonObj = new GameObject("SceneManager");
                instance = singletonObj.AddComponent<SceneManager>();
                DontDestroyOnLoad(singletonObj);
            }
            
            return instance;
        }
    }

    이것은 내가 처음에 찾았던 참고 자료를 회상한 것이다. 하지만 부족했다. 이해는 됐지만 싱글톤 구조는 공통화가 필요하다고 생각했고, C#의 getter를 활용하는 것이 더 좋을 것이라 생각했다. 이를 위해서 제네릭을 사용하고, null 병합 연산자를 사용해서 코드의 길이를 줄였다.

     

    [싱글톤 공통화 및 축약]

    public abstract class Utils
    {
        public static T InitSingleton<T>() where T : MonoBehaviour
        {
            var instance = Object.FindAnyObjectByType<T>();
            if (instance == null)
            {
                GameObject singletonObj = new();
                instance = singletonObj.AddComponent<T>();
                singletonObj.name = instance.GetType().Name;
                Object.DontDestroyOnLoad(singletonObj);
            }
            return instance;
        }
    }

    Utils 쪽에 T InitSingleTon<T>()을 선언해주었다.

    public class SceneManager : MonoBehaviour
    {
        private static SceneManager instance;
        public static SceneManager Instance {get => instance ??= Utils.InitSingleton<SceneManager>();}
    }

     null 병합 연산자 및 람다를 통해 코드를 축약하였다.

     

    [결과]

    Debug에 싱글톤 여부를 출력한다
    True
    오브젝트도 잘 생성되었다

     

    요약

    - C#에서 싱글톤 패턴을 한 줄로 줄일 수 있다.

Designed by Tistory.