본문 바로가기
1일 1 구현

[1일 1 구현] 코드 정리 및 공통 클래스

by LemongO 2024. 5. 15.

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