개발 조각글

Unity UI 컴포넌트 캐싱[0]

BaekNohing 2022. 5. 20. 18:58

UIObj.cs


Getcomponent는 비싸기 때문에, 스크립트 내에서 미리 캐싱해서 쓰고있는데. 

Find 함수를 쓰게 되면 매번 Find("name")을 달아줘야 한다. 

이 과정에서 캐싱을 위해 생성한 변수의 이름을 변경하거나, 해당 오브젝트의 이름을 변경하는 경우 NewName = transform.Find("OldName").GetCompoenet<Compoenet>();의 형식을 갖게 되는데 이게 점점 누적되면서, NewName과 OldName이 아주 다른 이름이 되어버리는 경우가 종종 생긴다.

이렇게 되면 대응되는 변수와 오브젝트를 찾기가 아주 어렵기 때문에 오브젝트 네임과 변수명을 반드시 일치시켜야만 하는 구조가 있어야 한다고 생각해 하나 만들었다. 

만들어두니 꽤 편리해서 여기저기 가져다 쓰는 중이다.


 public static class UIObj
{
    public static T GetT<T>(Transform parent, string targetName) where T : Component
        => parent.Find(targetName.Substring(1, targetName.Length - 1))?.GetComponent<T>();

    public static T GetEldistT<T>(Transform parent) where T : Component
    {
        T target;
        for (int i = 0; i < parent.childCount; i++)
        {
            target = parent.GetChild(i).GetComponent<T>();
            if (target != null)
                return target;
        }
        return null;
    }
    
    public static void SetAction(Button btn, UnityEngine.Events.UnityAction action)
    {
        btn.onClick.RemoveAllListeners();
        btn.onClick.AddListener(action);
    }
}