싱글톤을 만드는 방법에는 여러가지가 있지만,
프로퍼티를 이용하여 사용하기 편하게 하는 것이 좋다.
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 |