UI_Base 정리
- FindChild 메서드는 공용으로 쓰일 수 있으니 Util 전역 클래스를 생성해 이전
- Bind, Get 메서드를 쓸 때 타입 특화 메서드로 가독성과 사용성을 높였다.
- enum은 UI_Base에서는 쓰지 않으니 삭제했다.
- UI_Base를 추상클래스로 만들어 상속받는 클래스에서 Init 메서드를 강제했다.
public abstract class UI_Base : MonoBehaviour
{
protected Dictionary<Type, UnityEngine.Object[]> _dict = new Dictionary<Type, UnityEngine.Object[]>();
protected abstract void Init();
private void Awake()
{
Init();
}
protected void Bind<T>(Type type) where T : UnityEngine.Object
{
string[] names = Enum.GetNames(type);
UnityEngine.Object[] objs = new UnityEngine.Object[names.Length];
_dict.Add(typeof(T), objs);
for (int i = 0; i < names.Length; i++)
{
objs[i] = Util.FindChild<T>(gameObject, names[i]);
if (objs[i] == null)
Debug.Log($"바인드에 실패했습니다. : {names[i]}");
}
}
protected void BindButton(Type type) => Bind<Button>(type);
protected void BindImage(Type type) => Bind<Image>(type);
protected void BindTMP(Type type) => Bind<TextMeshProUGUI>(type);
protected T Get<T>(int index) where T : UnityEngine.Object
{
UnityEngine.Object[] objs;
if(_dict.TryGetValue(typeof(T), out objs) == false)
{
Debug.Log("컴포넌트를 가져오는데 실패했습니다.");
return null;
}
return objs[index] as T;
}
protected Button GetButton(int index) => Get<Button>(index);
protected Image GetImage(int index) => Get<Image>(index);
protected TextMeshProUGUI GetTMP(int index) => Get<TextMeshProUGUI>(index);
}
Util 전역 클래스
- 어느 클래스에서나 공통적으로 쓰일법한 기능들을 모아놓은 클래스
- 현재는 FindChild만 있다.
- 어느 오브젝트의 자식을 찾을지 알아야하니 매개변수에 GameObject가 추가되었다.
public static class Util
{
public static T FindChild<T>(GameObject go, string name) where T : UnityEngine.Object
{
if (go == null)
return null;
foreach (T child in go.GetComponentsInChildren<T>())
{
if (child.name == name)
return child;
}
return null;
}
}
'1일 1 구현' 카테고리의 다른 글
[1일 1 구현] PoolManager - 2 (0) | 2024.05.18 |
---|---|
[1일 1 구현] PoolManager - 1 (0) | 2024.05.16 |
[1일 1 구현] UI Base (0) | 2024.05.13 |
[1일 1 구현] UI Manager (0) | 2024.05.13 |
[1일 1구현] 시작 (0) | 2024.05.12 |