싱글톤을 만드는 방법에는 여러가지가 있지만,
프로퍼티를 이용하여 사용하기 편하게 하는 것이 좋다.
1.
public class InputManager : MonoBehaviour { private static InputManager _inputInstance; public static InputManager Instance { get { if(_inputInstance == null) { _inputInstance = FindObjectOfType(typeof(InputManager)) as InputManager; if(_inputInstance) { GameObject container = new GameObject(); container.name = "InputManagerObj"; _inputInstance = container.AddComponent(typeof(InputManager)) as InputManager; } } return _inputInstance; } } }
이것은 처음 _inputInstance 변수가 생성되지 않았을 때
이 스크립트가 붙어있는 GameObject에 있는 Component중에 찾아보고,
없으면 새로 GameObject(InputManagerObj)를 만들어서라도 싱글톤 객체를 만들어 넘겨주는 것
현재 위 소스는 MonoBehaviour를 상속 받았는데, 이건 GameObject에 Component로 붙겠다는 것이고
그 상황에서 필요한 함수와 변수들을 상속받는다는 것이다. 또한, GameObject에 붙어 사용되므로
new 연산자를 이용하여 아무데나 메모리를 할당 할 수 없다.
2.
public class SingleTon { private static SingleTon instance; public static SingleTon getInstance { get { if (instance == null) { instance = new SingleTon(); } return instance; } } public int TEST { set; get; } }
MonoBehaviour를 상속받지 않는 경우, instance가 null일 때 new로 메모리를 할당해주지만
Inspector창에서 변수 값을 조절할 수 없다.
3. 최애방법
public class Singleton<T> : MonoBehaviour where T : MonoBehaviour { private static T _instance = null; public static T Instance { get { if(_instance == null) { _instance = (T)FindObjectOfType(typeof(T)) as T; if(_instance == null) { Debug.Log("Singleton object null"); } } return _instance; } } }
// InputManager.cs public class InputManager : Singleton<InputManager> { public void TEST() { Debug.Log("InputManager singleton TEST"); } } //GetTest.cs public class GetTest : Singleton<InputManager> { void Awake() { InputManager.Instance.TEST(); } }
제네릭 싱글톤으로 싱글톤을 따로 빼서 재사용성을 극대화 한다.
'NOTE > Programming' 카테고리의 다른 글
[C++] 문자열을 입력받는 12가지 방법 (펌) (0) | 2018.04.01 |
---|---|
[C#] 열거형 형식 (0) | 2016.11.08 |
[C#] Func & Action 델리게이트 (펌) (0) | 2016.09.29 |
[C#] 람다식 (펌) (0) | 2016.09.29 |
[C#] 컬렉션 (0) | 2016.09.28 |