본문 바로가기

내일 배움 캠프/TIL

[내일 배움 캠프] 51일차 TIL

[UI 아키텍처 구성]

UI 개발을 효율적이고 확장성 있게 관리하기 위해 두 가지 핵심 클래스 도입

 

UIBase - UI 요소의 표준 바인딩 클래스

    ● 역할

        ○ Enum을 기반으로 한 UI 바인딩 시스템

        ○ 타입별로 UI 요소를 캐싱하고 코드에서 안전하게 접근 가능

        ○ 반복되는 Find와 GetComponent 코드를 제거

 

    ● 기본 구조

        ○ Enum의 이름을 기준으로 UI 요소를 찾아 _objects에 타입별로 캐싱

protected Dictionary<Type, UnityEngine.Object[]> _objects;

        ○ 예를 들어 enum Texts { Title, Description } 을 BindText(typeof(Texts))로 바인딩하면 Title, Description이라는 이름의 TextMeshProUGUI를 자동으로 연결

protected void BindText(Type type)
{
    Bind<TextMeshProUGUI>(type);
}

protected TextMeshProUGUI GetText(int idx)
{
    return Get<TextMeshProUGUI>(idx);
}

 

    ● 장점

        ○ UI 이름 변경 시 Enum 기반으로 추적 가능

        ○ 타입 안정성 확보

        ○ 씬 구조와 코드 간 결합 최소화

 

UIEventHandler - 모든 UI 이벤트를 단일 클래스에서 처리

    ● 버튼 클릭 외에도 드래그, 눌림, 뗌, 누르고 있는 동안 등 다양한 입력을 처리하려면 여러 인터페이스를 구현하거나 복잡한 리스너를 붙여야 함

    ● 이를 해결하기 위해 사용

public class UIEventHandler : MonoBehaviour,
    IPointerClickHandler, IPointerDownHandler, IPointerUpHandler,
    IDragHandler, IBeginDragHandler, IEndDragHandler
{
    public Action OnClickHandler;
    public Action OnPressedHandler;
    public Action<BaseEventData> OnDragHandler;
    ...
}

 

    ● 핵심 포인트

        ○ 클릭, 드래그, 누르기 등 모든 UI 입력 이벤트를 하나의 컴포넌트에서 처리

        ○ Action으로 외부에서 동적으로 이벤트 연결 가능

UIBase.BindEvent(myButtonObject, () => {
    Debug.Log("버튼이 눌렸습니다.");
}, type: UIEvent.Click);

 

        ○ 눌림 유지 감지는 Update()에서 _pressed를 체크하여 구현

private void Update()
{
    if (_pressed)
        OnPressedHandler?.Invoke();
}

 

    ● 장점

        ○ UI마다 이벤트 스크립트를 따로 만들 필요 없음

        ○ 게임 전체에서 이벤트 처리 로직을 일관되게 구성 가능