
2D 스프라이트는 마우스 이벤트를 OnMouseEnter(),OnMouseExit()등등의 이벤트가 미리 등록 되어 있다. 이때 스프라이트는 콜라이더가 필요하다.
UI는 OnMouseEnter()가 지원되지 않고 콜라이더도 필요하지 않는다.
UI는 IPointerEnterHandler,IPointerExitHandler 와 같은 인테페이스를 상속 받아야한다.
그리고 이러한 인터페이스의 OnPointerEnter(), OnPointerExit()와 같은 함수를 구현해야한다. 또한 마우스 이벤트의 상위에서 Raycast를 막고 있는 UI가 없는지 확인해야한다. 그리고 당연하게도 Raycast를 받을 UI 요소 역시 필수이다.
대표적인 이벤트 인터페이스와 함수를 정리해본다.
public void OnPointerEnter(PointerEventData eventData)
{
Debug.Log("enter : " + gameObject.name);
}
마우스가 해당 UI에 들어온 순간 호출된다.
public void OnPointerExit(PointerEventData eventData)
{
Debug.Log("exit : " + gameObject.name);
}
마우스가 해당 UI에서 나간 순간 호출 된다.
public void OnPointerDown(PointerEventData eventData)
{
Debug.Log("down : " + gameObject.name);
}
마우스가 해당 UI를 클릭한 순간 호출 된다.
public void OnPointerUp(PointerEventData eventData)
{
Debug.Log("up : " + gameObject.name);
}
마우스가 해당 UI를 누른 상태에서 뗀 순간 호출 된다.
public void OnBeginDrag(PointerEventData eventData)
{
Debug.Log("beginDrag : " + gameObject.name);
}
마우스가 해당 UI를 드래그한 시작 순간에 호출된다.
public void OnDrag(PointerEventData eventData)
{
Debug.Log("drag : " + gameObject.name);
}
마우스가 해당 UI를 드래그하기 시작하고 종료할 때까지 동안 호출된다.
public void OnEndDrag(PointerEventData eventData)
{
Debug.Log("end drag : " + gameObject.name);
}
마우스가 해당 UI를 드래그 종료한 순간(마우스를 뗀 순간) 호출 된다.
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