Unity_개발일지_27

홍신영·2024년 11월 27일
0

Unity

목록 보기
29/62

추상화 싱글톤 만들어 상속 받아 사용하기

보통 매니저클래스에 싱글톤을 많이 사용한다.
매니저들이 많아지면 싱글톤이 그 만큼 많아지기도 하고 겹치는 코드가 계속해서 생기기도 한다.
또 이에 따라 전역 클래스가 많아진다.

이를 하나의 싱글톤을 추상화 클래스로 만들어 제네릭타입으로 다른 타입을 모두 받아 단일 인스턴스로 접근할 수 있게 해주자.

제네릭 클래스 T를 사용해 싱글톤을 만들어주자.
T는 반드시 singleton를 상속받도록 제한을해준다.
나머지는 기본적인 싱글톤 구조를 만들어주고,인스턴스가 없다면 create메소드로 생성 부분은 따로 빼주었다.

public abstract class Singleton<T> : MonoBehaviour where T : Singleton<T>
{
    private static T _instance = null;

    public static T Instance
    {
        get
        {
            if (_instance == null)
                Create();
            return _instance;
        }
    }

Create메소드
인스턴스가 없다면, FindObjectsOfType()로 씬에 존재하는 모든 T 타입의 객체를 찾도록 해준다.
또 같은 타입의 객체가 여럿 있다면, 첫 번째 객체만 사용하고 나머지는 파괴하도록 해준다.
없는 경우에는 게임오브젝트를 생성하고 T 컴포넌트를 추가해준다.

protected static void Create()
{
  if (_instance == null)
  {
      T[] objects = FindObjectsOfType<T>();

      if (objects.Length > 0)
      {
          _instance = objects[0];

          for (int i = 1; i < objects.Length; ++i)
          {
              if (Application.isPlaying)
                  Destroy(objects[i].gameObject);
              else
                  DestroyImmediate(objects[i].gameObject);
          }
      }
      else
      {
          GameObject go = new GameObject(string.Format("{0}", typeof(T).Name));
          _instance = go.AddComponent<T>();
      }
  }
}

마지막으로 라이프사이클 함수들을 상속받도록 virtual로 선언해주면 끝이난다.
Awake에는 인스턴스가 있는지 있다면 파괴하고 없다면 사라지지 않도록 해준다.

protected virtual void Awake()
{
  Create();

  if(_instance != this)
  {
      Destroy(gameObject);
  }
  else
  {
      DontDestroyOnLoad(this);
  }
}

protected virtual void OnEnable(){}

protected virtual void Start(){}

protected virtual void Update(){}

protected virtual void FixedUpdate(){}

protected virtual void LateUpdate(){}

protected virtual void OnDisable(){}

protected virtual void OnDestroy()
{
  _instance = null;
}

싱글톤 개선버전 잘 이용해보자.

profile
게임 클라이언트 개발자

0개의 댓글