싱글턴 패턴의 매니저를 여러 번 선언하다보면 형태가 대부분 비슷한 것을 알 수 있다.
따라서 싱글턴의 기본 형태가 되는 부분을 제네릭으로 선언 후 그것을 상속받아 매니저를 구현할 수 있도록 만들 수가 있다.
제네릭 싱글턴 클래스 구현
using UnityEngine;
public class Singleton<T> : MonoBehaviour where T : Component
{
private static T _instance;
public static T Instance
{
get
{
if (_instance == null)
{
_instance = FindObjectOfType<T>();
if (_instance == null)
{
GameObject obj = new GameObject();
obj.name = typeof(T).Name;
_instance = obj.AddComponent<T>();
}
}
return _instance;
}
}
public void Awake()
{
if (_instance == null)
{
_instance = this as T;
DontDestroyOnLoad(gameObject);
}
else
{
Destroy(gameObject);
}
}
}
특이한 점은 Instance 프로퍼티가 호출될 때 비로소 싱글턴의 생성이 이루어진다.
이것을 게으른 초기화라고 부른다.
Awake 부분이 골때리는데, 씬을 이동했을 때 DontDestroyOnLoad가 호출된 싱글턴 오브젝트도 같이 이동하는데, 이동한 씬에 이미 같은 싱글턴 컴포넌트가 부착된 오브젝트가 있을 경우 그 오브젝트를 파괴하는 스크립트이다!
이로써 씬을 이동하더라도 완전하게 싱글턴의 유일성을 보장해줄 수 있는 것이다.
호출하여 사용할 때는 다음과 같이 사용하면 된다.
public class GameManager : Singleton<GameManager>
Uploaded by N2T
'개발 > Unity 내일배움캠프 TIL' 카테고리의 다른 글
의존성 주입 (DI, Dependency Injection) (0) | 2023.11.16 |
---|---|
Unity 스크립터블 오브젝트로 이벤트 시스템 만들기 (0) | 2023.11.15 |
최종프로젝트를 앞두며 (0) | 2023.10.20 |
Unity 포톤 동기화 작업 시 주의할 점들 (1) | 2023.10.19 |
Unity 기존 게임을 포톤 PUN2로 동기화하기 (1) | 2023.10.18 |