티스토리 뷰
싱글톤 패턴은 하나의 인스턴스에 전역적인 접근을 시키며 보통 호출될 때 인스턴스화 되므로 사용하지 않는다면 생성되지도 않습니다.
유니티에서 싱글톤 패턴은 매니저 클래스와 같이 여러 클래스에서 같은 인스턴스에 접근이 가능해야 하는 경우에 사용됩니다.
어디서나 접근할 수 있다는 매우 편리한 장점이 있지만 이 장점 덕분에 결합도가 높아지는 결과가 생길 수 있으므로 주의하면서 사용해야 됩니다.
유니티에서의 싱글톤 패턴의 구현은 매우 다향한 방법이 있어 자신에게 맞는 방법을 택하면 좋을 것 같습니다. 아래에 몇 가지 구현 방법을 적어놓았습니다.
1. Awake 에서 초기화 하는 방법
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | using UnityEngine; public class SingletonAwake : MonoBehaviour { #region Singleton public static SingletonAwake Instance; private void Awake() { if (Instance == null) { Instance = this; } } #endregion } | cs |
Awake 함수에서 Instance를 초기화 합니다. 이 방법은 매우 간단하게 구현이 가능하다는 장점이 있지만 코드가 조금 지분해지고 재사용 가능하지 않다는 단점이 있습니다.
2. MonoBehaviour를 상속 받고 제네릭을 사용한 방법
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | using UnityEngine; public class SingletonMono<T> : MonoBehaviour where T : MonoBehaviour { private static T instance = null; public static T Instance { get { if(instance == null) { instance = FindObjectOfType(typeof(T)) as T; } if (instance == null) { instance = new GameObject("Singleton").AddComponent<T>(); } return instance; } } } | cs |
제네릭을 이용한 방법으로 이 클래스를 상속받아 싱글톤 패턴을 구현합니다. FindObjectOfType(typeof(T)) 은 현재 활성화된 게임오브젝트의 컴포넌트 중 T(입력한 클래스) 타입을 찾아 Object형식으로 반환합니다. 만약 FindObjectOfType 에서 찾지 못한다면 새로 만들어 싱글톤 클래스를 추가를 해주기 때문에 편리합니다. MonoBehaviour를 상속받아 인스펙터에서 값을 조절하거나 관찰할 수 있다는 장점이 있습니다.
3. MonoBehaviour를 상속받지 않고 제네릭을 사용한 방법
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | public class SingletonCSharp <T> where T : new() { private static T instance; public static T Instance { get { if(instance == null) { instance = new T(); return instance; } else { return instance; } } } } | cs |
위와 마찬가지로 제네릭을 이용하여 편하게 상속받아 사용하면 싱글톤 패턴이 구현이됩니다. MonoBehaviour를 상속받지 않아 new 를 사용할 수 있습니다.
'Unity > Study' 카테고리의 다른 글
[Unity] Transform 이 성능에 미치는 영향 (0) | 2018.07.05 |
---|---|
[Unity] 옵저버 패턴 (0) | 2018.07.04 |
[WPF] Delegate + 트리 하위 요소 탐색 (0) | 2018.06.07 |
[Unity] Coroutine 의 yield return 뒤 함수 확장 (0) | 2018.05.31 |
[Unity] 키 입력 받는 방법 세 가지 비교 (3) | 2018.05.28 |
댓글