부트캠프/Unity [ 스파르타 ]

[스파르타 ][TIL] 유니티 스파르타 7기 42일차 - PointerEventData

맏난거 2025. 4. 8. 20:58

1. 역할과 기능

  • 포인터 입력 데이터 캡슐화:
    PointerEventData는 포인터 이벤트가 발생했을 때 이벤트에 관련된 모든 정보를 한 곳에 모읍니다. 이를 통해 인터페이스 내 이벤트(클릭, 드래그, 터치 등)를 쉽고 일관되게 처리할 수 있습니다.
  • 이벤트 전파와 인터랙션:
    해당 데이터를 이벤트 핸들러(예: IPointerClickHandler, IDragHandler 등)에 전달하여, 사용자 입력에 따른 적절한 로직 실행을 가능하게 합니다.
  • UI 시스템 및 게임 오브젝트 상호작용:
    UI 요소 외에도 3D 게임 오브젝트 등에서 포인터 이벤트를 사용하여 선택, 클릭, 드래그 등의 상호작용을 구현할 수 있습니다.

2. 주요 속성과 변수

PointerEventData 클래스는 다양한 속성을 제공하며, 각각의 속성은 특정 포인터 이벤트의 정보를 나타냅니다. 그 중 대표적인 것들은 다음과 같습니다:

  • pointerId:
    포인터의 고유 식별자입니다. 다중 터치 입력 등에서 각 터치나 포인터 이벤트를 식별하는 데 사용됩니다.
  • position, delta, pressPosition:
    • position: 현재 포인터 위치(스크린 좌표)를 나타냅니다.
    • delta: 이전 프레임 대비 포인터의 이동량을 나타냅니다.
    • pressPosition: 포인터가 처음 눌렸을 때의 스크린 좌표입니다.
  • clickTime, clickCount:
    • clickTime: 마지막 클릭 이벤트가 발생한 시간.
    • clickCount: 연속 클릭(더블클릭 등) 횟수를 기록하여, 이를 기반으로 특정 동작(예: 더블클릭 이벤트)을 처리할 수 있습니다.
  • scrollDelta:
    스크롤 휠의 이동량이나 터치스크린의 스크롤 제스처 등을 나타냅니다.
  • pointerEnter, pointerCurrentRaycast, pointerPress, lastPress:
    • pointerEnter: 현재 포인터가 입장해 있는 게임 오브젝트(UI 요소)를 의미합니다.
    • pointerCurrentRaycast: 포인터 이벤트를 처리하는 동안 현재 레이캐스트(raycast) 결과를 담고 있어, 어느 요소가 클릭되었는지 또는 터치되었는지를 판단하는 데 사용합니다.
    • pointerPress, lastPress: 마지막으로 클릭 혹은 누른 오브젝트에 대한 정보를 저장합니다.
  • useDragThreshold:
    드래그 시작 여부를 판단하기 위한 임계값 사용 여부를 결정합니다. 이 값이 true인 경우, 사용자는 설정된 임계값(드래그 시작 거리) 이상 포인터를 이동시켜야 드래그 이벤트가 발생합니다.
  • dragging:
    현재 드래그 중임을 나타내며, 이를 통해 드래그 상태를 관리할 수 있습니다.
  • button:
    어떤 마우스 버튼(왼쪽, 오른쪽, 가운데 버튼 등)이 사용되었는지를 나타냅니다. 이는 마우스 이벤트를 처리하는 데 있어서 중요한 정보입니다.

3. 사용 예시

PointerEventData는 주로 다음과 같은 방식으로 사용됩니다. 예를 들어, IPointerClickHandler 인터페이스를 통해 클릭 이벤트를 처리하는 스크립트에서 다음과 같이 활용할 수 있습니다.

using UnityEngine;
using UnityEngine.EventSystems;

public class MyButtonHandler : MonoBehaviour, IPointerClickHandler
{
    public void OnPointerClick(PointerEventData eventData)
    {
        // 포인터의 클릭 위치를 로그에 남깁니다.
        Debug.Log("Clicked at: " + eventData.position);

        // 클릭된 오브젝트의 정보를 활용할 수 있습니다.
        if (eventData.pointerEnter != null)
        {
            Debug.Log("Pointer entered: " + eventData.pointerEnter.name);
        }
    }
}

위 예시에서는 PointerEventData 객체를 사용하여 사용자가 클릭한 위치, 클릭한 오브젝트 등의 정보를 확인한 후, 그에 따른 로직을 구현할 수 있음을 보여줍니다.

또한, 드래그 이벤트 처리 시에도 IDragHandler를 구현하여 PointerEventData의 delta 값을 사용해 오브젝트를 이동하는 방식으로 활용할 수 있습니다.


4. 이벤트 시스템과의 통합

유니티 이벤트 시스템은 기본적으로 EventSystem 클래스를 통해 작동하며, PointerEventData는 이러한 이벤트 시스템에서 각 입력 이벤트를 처리하는 핵심 데이터로 사용됩니다.

  • EventSystem:
    이 클래스는 모든 입력 이벤트를 관리하며, 입력 이벤트가 발생하면 적절한 게임 오브젝트에 전달합니다.
  • GraphicRaycaster:
    UI 캔버스와 결합되어 UI 요소에 레이캐스트를 수행하고, 그 결과를 PointerEventData의 pointerCurrentRaycast에 할당합니다.

이처럼 PointerEventData는 입력 이벤트의 전반적인 처리와 전달에 있어서 중심적인 역할을 담당합니다.

 

유니티의 PointerEventData는 포인터 입력과 관련된 모든 중요한 정보를 담아, 이벤트 핸들링 및 UI 상호작용을 보다 쉽게 구현할 수 있도록 돕습니다. 다양한 속성을 통해 위치, 이동량, 클릭 정보 등을 얻고, 이를 바탕으로 사용자 경험을 개선할 수 있습니다.

이러한 기능 덕분에 유니티의 UI 시스템 및 사용자 입력 시스템 구현 시 PointerEventData는 빠질 수 없는 중요한 구성요소입니다.