TIL_2025_03_27 UI 마우스 이벤트

김효중·2025년 3월 27일
post-thumbnail

스프라이트와 UI 이벤트의 차이

2D 스프라이트는 마우스 이벤트를 OnMouseEnter(),OnMouseExit()등등의 이벤트가 미리 등록 되어 있다. 이때 스프라이트는 콜라이더가 필요하다.

  • 미리 등록 된 함수 사용
  • 콜라이더 필수

UI는 OnMouseEnter()가 지원되지 않고 콜라이더도 필요하지 않는다.
UI는 IPointerEnterHandler,IPointerExitHandler 와 같은 인테페이스를 상속 받아야한다.
그리고 이러한 인터페이스의 OnPointerEnter(), OnPointerExit()와 같은 함수를 구현해야한다. 또한 마우스 이벤트의 상위에서 Raycast를 막고 있는 UI가 없는지 확인해야한다. 그리고 당연하게도 Raycast를 받을 UI 요소 역시 필수이다.

  • 인터페이스를 상속 받고 함수 구현하여 사용
  • Raycast 확인: 막는 상위 오브젝트, 받을 오브젝트

대표적인 이벤트 인터페이스와 함수를 정리해본다.

UI 이벤트 인터페이스와 함수

IPointerEnterHandler - OnPointerEnter

public void OnPointerEnter(PointerEventData eventData)
{
    Debug.Log("enter : " + gameObject.name);
}

마우스가 해당 UI에 들어온 순간 호출된다.

IPointerExitHandler - OnPointerExit

public void OnPointerExit(PointerEventData eventData)
{
    Debug.Log("exit : " + gameObject.name);
}

마우스가 해당 UI에서 나간 순간 호출 된다.

IPointerDownHandler - OnPointerDown

public void OnPointerDown(PointerEventData eventData)
{
    Debug.Log("down : " + gameObject.name);
}

마우스가 해당 UI를 클릭한 순간 호출 된다.

IPointerUpHandler - OnPointerUp

public void OnPointerUp(PointerEventData eventData)
{
    Debug.Log("up : " + gameObject.name);
}

마우스가 해당 UI를 누른 상태에서 뗀 순간 호출 된다.

IBeginDragHandler - OnBeginDrag

public void OnBeginDrag(PointerEventData eventData)
{
    Debug.Log("beginDrag : " + gameObject.name);
}

마우스가 해당 UI를 드래그한 시작 순간에 호출된다.

IDragHandler - OnDrag

public void OnDrag(PointerEventData eventData)
{
    Debug.Log("drag : " + gameObject.name);
}

마우스가 해당 UI를 드래그하기 시작하고 종료할 때까지 동안 호출된다.

IEndDragHandler - OnEndDrag

public void OnEndDrag(PointerEventData eventData)
{
    Debug.Log("end drag : " + gameObject.name);
}

마우스가 해당 UI를 드래그 종료한 순간(마우스를 뗀 순간) 호출 된다.

IDropHandler - OnDrop

public void OnDrop(PointerEventData eventData)
{
    Debug.Log("drop : " + gameObject.name);
}

마우스가 해당 UI 위에서 드래그를 멈췄을 때 호출 된다.
예시로 아이콘을 휴지통에 넣었을 때 휴지통에서 이 함수가 호출 된다.

예제

마우스를 이용해 UI를 드래그하여 위치를 옮기고 뗀 순간 원래 위치로 돌아가는 코드 예제

public class CardInterface : MonoBehaviour, IDragHandler, IPointerEnterHandler, IPointerExitHandler, IEndDragHandler, IBeginDragHandler
{

    public UnityAction OnEndDragActin;
    private RectTransform rt;
    private CanvasGroup canvasGroup;
    private Vector3 originPos;
    float distance = 10.0f;


    void Awake()
    {
        rt = GetComponent<RectTransform>();
        canvasGroup = GetComponent<CanvasGroup>();
    }

    // Start is called before the first frame update
    void Start()
    {
        originPos = rt.anchoredPosition;
    }

    // Update is called once per frame
    void Update()
    {

    }
    public void OnPointerEnter(PointerEventData eventData)
    {
        Debug.Log("enter : " + gameObject.name);
    }

    public void OnPointerExit(PointerEventData eventData)
    {
        Debug.Log("exit : " + gameObject.name);
    }
    public void OnDrag(PointerEventData eventData)
    {
        transform.position = eventData.position;
    }

    public void OnEndDrag(PointerEventData eventData)
    {
        Debug.Log("end drag : " + gameObject.name);
        OnEndDragActin?.Invoke();
        rt.anchoredPosition = originPos;
        canvasGroup.blocksRaycasts = true;
    }
    public void OnBeginDrag(PointerEventData eventData)
    {
        canvasGroup.blocksRaycasts = false;
    }

}

참조
https://docs.unity3d.com/kr/2021.3/Manual/SupportedEvents.html

profile
도전하는 개발자

0개의 댓글