Programing/Unity(C#)

[Unity] 버튼 눌리는 이벤트(Pointer Down, Pointer Up)

hye3193 2024. 3. 4. 20:38

버튼을 누를 때 눌리고 있는 효과를 내 주기 위한 방법

 

1. Event Trigger 컴포넌트 활용하기

버튼 오브젝트에 Event Trigger 컴포넌트를 추가해주고, Add New Event Type으로

Pointer Down(눌렸을 때)

Pointer Up(뗐을 때)

이벤트를 추가해서 스크립트 넣고 각각 이벤트 발생 시 실행할 함수를 지정해주면 된다

 

2. 스크립트로 추가하기

* 기존에 사용하던 이벤트 핸들러를 수정하여 사용했다

public class UI_PressEventHandler : MonoBehaviour, IPointerDownHandler, IPointerUpHandler
{
    public Action<PointerEventData> OnDownHandler = null;
    public Action<PointerEventData> OnUpHandler = null;

    public void OnPointerDown(PointerEventData eventData)
    {
        if (OnDownHandler != null)
            OnDownHandler.Invoke(eventData);
    }

    public void OnPointerUp(PointerEventData eventData)
    {
        if (OnUpHandler != null)
            OnUpHandler.Invoke(eventData);
    }
}

UI_PressEventHandler를 생성해 주고

 

1. 대상 게임 오브젝트에 UI_PressEventHandler 추가하기

2. OnDownHandler와 OnUpHandler에 각각 action 추가하기

를 해 주면 된다

 

public static void BindEvent(
	GameObject go,
    Action<PointerEventData> action,
    Define.UIEvent type = Define.UIEvent.Click,
    Action<PointerEventData> actionEx = null
)
{
    switch (type)
    {
        case Define.UIEvent.Press:
            UI_PressEventHandler pressEvt = Util.GetOrAddComponent<UI_PressEventHandler>(go);
            pressEvt.OnDownHandler -= action;
            pressEvt.OnUpHandler -= actionEx;
            pressEvt.OnDownHandler += action;
            pressEvt.OnUpHandler += actionEx;
            break;
    }
}

나의 경우 UI_Base 스크립트에 위와 같이 작성해주는 방식으로 구현하였다

 

이어서 버튼 컴포넌트에서

private void BtnDownEvt(PointerEventData data)
{
    Dir dir = (Dir)Enum.Parse(typeof(Dir), data.pointerEnter.name);
    Debug.Log(dir);
    PressBtn(dir, true);
    dirCoroutine[(int)dir] = StartCoroutine(MovePlayer(dir));
}

private void BtnUpEvt(PointerEventData data)
{
    Dir dir = (Dir)Enum.Parse(typeof(Dir), data.pointerPress.name);
    PressBtn(dir, false);
    if (dirCoroutine[(int)dir] != null)
        StopCoroutine(dirCoroutine[(int)dir]);
    player.SetStop();
}

이런 식으로 작성해주면 된다

(BtnDownEvt, BtnUpEvt는 각각 OnDownHandler, OnUpHandler에 연결시켜두었다)

* 각 버튼 오브젝트의 이름도 아래 Dir 내 이름들과 동일하게 맞춰두어야 한다

enum Dir
{
    Up,
    Down,
    Left,
    Right
}

Dir의 경우 Define 스크립트 내에 위와 같이 작성해두었다

 

* data에서 오브젝트의 이름을 받아올 때

클릭 이벤트의 경우 data.pointerClick.name으로 받아올 수 있었지만 지금은 Enter와 Exit 상태에 이벤트를 연결해둔 것이기 때문에 각각 pointerEnter과 pointerPress로 data에서 이름을 추출해야 한다