Unity3D_MMO - UI 자동화 (3)

k_hyun·2022년 10월 12일
0

Unity_MMO_Project

목록 보기
10/33

Define.cs

public enum UIEvent
    {
        Click,
        Drag,
    }

UIEvent의 타입을 구분하기 위해 선언하였다.

UIEventHandler.cs

	public Action<PointerEventData> OnClickHandler = null;
    public Action<PointerEventData> OnDragHandler = null;

    public void OnPointerClick(PointerEventData eventData)
    {
        if (OnClickHandler != null)
            OnClickHandler.Invoke(eventData);
    }
    

    public void OnDrag(PointerEventData eventData)
    {
        if (OnDragHandler != null)
            OnDragHandler.Invoke(eventData);
    }

클릭과 드래그하는 액션 두 개를 선언하였다.

Util.cs

// 컴포넌트가 있으면 그냥 반환, 없으면 추가해서 반환해주는 함수
    public static T GetOrAddCompoent<T>(GameObject go) where T : UnityEngine.Component
    {
        T component = go.GetComponent<T>();
        if (component == null)
            component = go.AddComponent<T>();

        return component;
    }

UI_Base.cs

public static void AddUIEvent(GameObject go, Action<PointerEventData> action, Define.UIEvent type = Define.UIEvent.Click)
    {
        UI_EventHandler evt = Util.GetOrAddCompoent<UI_EventHandler>(go);

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

        }
    }

게임오브젝트에 존재하는 UI_EventHandler.cs에 접근 또는 컴포넌트를 추가하는 함수이다.

클릭이냐, 드래그냐에 따라 어떤 핸들러에 적용할지 구분된다.

Extension.cs

// Extension의 경우 static class
public static class Extension
{
    // go 앞에 this를 추가
    // go.AddUIEvent가 가능하다.
    public static void AddUIEvent(this GameObject go, Action<PointerEventData> action, Define.UIEvent type = Define.UIEvent.Click)
    {
           UI_Base.AddUIEvent(go, action, type);
    }
}

GameObject.AddUIEvent(...)가 가능해진다.

UI_Button.cs

void Start()
    {
        Bind<Button>(typeof(Buttons));
        Bind<Text>(typeof(Texts));
        Bind<GameObject>(typeof(GameObjects));
        Bind<Image>(typeof(Images));

        

        GetButton((int)Buttons.PointButton).gameObject.AddUIEvent(OnButtonClicked, Define.UIEvent.Click);

        GameObject go = GetImage((int)Images.ItemIcon).gameObject;
        AddUIEvent(go, (PointerEventData data) => { go.transform.position = data.position; }, Define.UIEvent.Drag);
    }

    int _score = 0;

    public void OnButtonClicked(PointerEventData data)
    {
        _score++;
        GetText((int)Texts.ScoreText).text = $"점수 : {_score}";
    }

Extension 덕분에 GetButton을 통해 얻은 게임오브젝트에서 바로 AddUIEvent()를 실행할 수 있다.

0개의 댓글