코린이 부트캠프 일상
유니티 제너릭 싱글톤 패턴(Generic Singleton) 및 Scene 관리
게발인개발자
2024. 1. 11. 02:42
게임 매니저만 싱글톤 패턴을 이용해서 게임매니저가 필요한 모든 매니저의 정보를 갖고 게임매니저에서 정보를 불러오는 방식으로 구현을 해왔다. 이렇게 구현하게 되면 public의 사용이 많아진다는 단점이 있다고 생각해서 이번에 모든 매니저급 cs를 전부 싱글톤을 만들어 사용할려고 한다. 이에 따라 유지 보수성이 좋게 제너릭 싱글톤을 사용해 보려고 한다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//재너릭 싱글톤 모든 매니저들이 상속 받을 수 있게 선언
public class Singleton<T> : MonoBehaviour where T : MonoBehaviour
{
private static T instance;
// 어디서든 불러올 수 있게 파라미터와 다수의 매니저 생성 예외처리
public static T Instance
{
get
{
if(instance == null)
{
GameObject obj;
obj = GameObject.Find(typeof(T).Name);
if(obj == null)
{
obj = new GameObject(typeof(T).Name);
instance = obj.AddComponent<T>();
}
else
{
instance = obj.GetComponent<T>();
}
}
return instance;
}
}
//Awake에서 각 매니저의 필요한 내용이 달라질 수 있으므로 가상함수로 선언
protected virtual void Awake()
{
if(instance == null)
{
// as는 C#에서 형변환 연산자로 사용 참조형식을 다른 참조형식으로 변환할 때 사용 as 연산자는 변환이 실패하면 null로 반환
instance = this as T;
DontDestroyOnLoad(gameObject);
}
else
{
Destroy(gameObject);
}
}
public class AnyManager : Singleton<AnyManager>
{
// 필요에 맞게 Awake 부분은 Override
protected override void Awake()
{
base.Awake();
}
// Start is called before the first frame update
void Start()
{
Show("UIPopup");
}
// Update is called once per frame
void Update()
{
}
// UI를 나타나게 해주는 함수 물론 예외처리가 필요하기 때문에 추후 추가 예정
public void Show(string canvas)
{
GameObject uiPopup = Resources.Load<GameObject>($"UI/{canvas}");
Instantiate(uiPopup);
}
}
UI를 Prefab으로 만들어서 Resources 폴더에서 관리해주면 밑에 사진과 같이 씬에는 UI를 관리해주는 매니저만 존재하면 된다. 이런 식으로 Scene에 오브젝트를 담고 있지 않고 필요할 때 인스턴스해주는 방식을 이용하면 스크립트를 수정할 때 적용시간이 적게 걸려 시간단축이 가능하다.
UI는 잘 나타났지만 해당 오류가 발생하였다. 아마 싱글톤 스크립트 파라미터 설정에서 오류가 난 것 같다.
오늘 해결은 어려울 것 같고 내일 해결방법과 load에 대한 예외처리와 함께 업로드를 할 예정이다.