-
유니티 싱글톤 패턴 구현 및 축약 (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#에서 싱글톤 패턴을 한 줄로 줄일 수 있다.