게임 관리자를 위해 쉽게 사용가능한 싱글톤 인스턴스를 만들기 위해 사용 가능한 추상 클래스를 만들어보자. 싱글톤이 게임 개발에 있어서 적절한 디자인 패턴인지에 대해서는 의견이 많지만 소규모 팀의 경우에는 싱글톤으로 얻을 수 있는 것이 잃을 수 있는 것보다 많기 때문에 적합하다고 생각한다. 싱글톤은 쉽게 말해 전역적으로 액세스 가능하게 코드 전체에 종속성을 생성하느 것이다.
using UnityEngine;
public abstract class SingletonMonoBehaviour<T> : MonoBehaviour where T : MonoBehaviour
{
private static T instance;
public static T Instance
{
get
{
return instance;
}
}
protected virtual void Awake()
{
if (instance == null)
{
instance = this as T;
}
else
{
Destroy(gameObject);
}
}
}
---예를 들면 아래와 같은 두 스크립트가 있고 두 오브젝트가 있다고 하자.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class TestGameManager : SingletonMonoBehaviour<TestGameManager>
{
public void TestMethod()
{
Debug.Log("Test Method Called");
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class TestOtherComponent : MonoBehaviour
{
private void Start()
{
TestGameManager.Instance.TestMethod();
}
}
이러면 TestGameManager 오브젝트의 TestGameManager 스크립트가 실행되면서 SingletonMonoBehaviour의 TestGameManager 타입으로 인스턴스가 생성된다. 그러면 TestObject에서 TestOtherComponent의 TestGameManager.Instance.TestMethod();가 실행되면서 TestGameManager 인스턴스의 TestMethod가 실행되 log가 출력된다.
만약에 TestGameManager가 여러 개면 싱글톤으로 여러개의 인스턴스가 생성되게 되지만 Destory가 해당 오브젝트를 파괴시켜 싱글톤 중복을 방지시켜준다. 예를 들어 TestGameManager가 10개 있을 때 실행시키면 아래와 같다.
아래와 같이 GameManager를 Destroy 해서 하나의 싱글톤 오브젝트만 남는 것을 확인할 수 있다.
이를 통해 인스턴스가 이미 있으면 해당 인스턴스를 파괴시켜서 항상 하나의 싱글톤만 존재할 수 있도록 한다.