본문 바로가기
게임개발/유니티 엔진

UI 자동화

by do_ng 2024. 3. 3.

수동으로 일일히 해당 UI에 컴포넌트를 적용시키는 것의 단점

 

적용할 컴포넌트(스크립트)가 매우 많아지게 되면 추후에 관리하기가 매우 복잡해짐  

 

 

코드로 UI에 컴포넌트를 적용하는 것을 자동화 시키는 방법

 

1. 해당 오브젝트에 컴포넌트로 연결을 자동화 시킬 UI 오브젝트들의 이름을 종류별로 정의

public class UI_Btn{
    enum Buttons
    {
        PointBtn
    }
    
    enum Images
    {
        ItemIcon
    }
}

 

 

Button 컴포넌트를 가지고 있는 "PointBtn" UI 오브젝트에 Button 클릭이벤트를 컴포넌트를 연결시킨다고 가정

 

 

2. 유니티 씬상에 연결시킬 컴포넌트 종류에 관한 UI 오브젝트가 있는지 확인

Bind<Button>(typeof(Buttons));
public class UI_Base : MonoBehaviour
{
    Dictionary<Type, UnityEngine.Object[]> objects = new Dictionary<Type, UnityEngine.Object[]>();

    protected void Bind<T>(Type type) where T : UnityEngine.Object
    {
        string[] names = Enum.GetNames(type);
        UnityEngine.Object[] object1 = new UnityEngine.Object[names.Length];
        //  Bind<T> 형식이 Bind<Button>인 경우 typeof(T)는 typeof(Button)
        objects.Add(typeof(T), object1);

        for (int i = 0; i < names.Length; i++)
        {
            if (typeof(T) == typeof(GameObject))
                object1[i] = Util.FindChild(gameObject, names[i], true);
            else
                object1[i] = Util.FindChild<T>(gameObject, names[i], true);
        }
    }
}

 

"PointBtn" UI 오브젝트에 Button 컴포넌트 타입을 연결하기 때문에 <T>는 <Button> 타입에 대해서만 부모 오브젝트 산하에 있는 모든 <Button> 타입 컴포넌트를 가져와서 그 중에서 연결시키려는 "PointBtn" 이름과 일치하는 UI만 가져옴

 

 

3. 해당 컴포넌트의 UI 오브젝트에 컴포넌트(새로운 스크립트, 이벤트 함수)를 등록 

GameObject pb = Get<Button>((int)Buttons.PointBtn).gameObject;
Dictionary<Type, UnityEngine.Object[]> objects = new Dictionary<Type, UnityEngine.Object[]>();

protected T Get<T>(int idx) where T : UnityEngine.Object
{
    UnityEngine.Object[] _objects = null;
    if (objects.TryGetValue(typeof(T), out _objects) == false)
        return null;

    return _objects[idx] as T;
}

 

"PointBtn" 라는 UI 오브젝트에 이벤트 함수를 컴포넌트로 등록하기 위해서 <Button> 타입으로 추가한 것들 중에서 "PointBtn" 라는 이름을 가지고 있는 UI 오브젝트만 뽑아냄 

 

뽑아낸 "PointBtn" Button UI 오브젝트에 이벤트를 컴포넌트로 등록시킴

AddUIEvent(pb, BtnOnClicked, Defines.UIEvent.Click);

public void BtnOnClicked(PointerEventData data)
{
    score++;
    GetText((int)Texts.ScoreTxt).text = $"점수 : {score}";
}
public static T GetOrAddComponent<T>(GameObject go) where T : UnityEngine.Component
{
    T component = go.GetComponent<T>();
    if (component == null)
        component = go.AddComponent<T>();

    return component;
}
public static void AddUIEvent(GameObject go, Action<PointerEventData> action, Defines.UIEvent type = Defines.UIEvent.Click)
{
    UI_EventHandler evt = Util.GetOrAddComponent<UI_EventHandler>(go);

    switch (type)
    {
        case Defines.UIEvent.Click:
            evt.OnClickHandler -= action;
            evt.OnClickHandler += action;
            break;
        case Defines.UIEvent.Drag:
            evt.OnDragHandler -= action;
            evt.OnDragHandler += action;
            break;
    }
}

 

여기서는 UI Button 오브젝트에 컴포넌트(이벤트 핸들러 스크립트)를 추가하고 조건에 따라서 이벤트가 발생시 실행할 메소드를 추가함

 

'게임개발 > 유니티 엔진' 카테고리의 다른 글

오브젝트 풀링(Object Pooling)  (0) 2024.03.06
UI 이벤트 시스템  (0) 2024.03.04
UI 앵커 사용법  (0) 2024.02.27
애니메이션 State 패턴 적용  (0) 2024.02.26
에니메이션 Lerp  (0) 2024.02.22