오늘은 IPointer 인터페이스에 대해서 정리.
사용 목적
- IPointer 인터페이스들은 유니티의 Event System(이벤트 시스템)에서 제공하는 핵심 인터페이스로, 주로 UI 요소나 Graphic Raycaster 컴포넌트가 부착된 오브젝트에 마우스나 터치 같은 포인터 입력을 처리하기 위해 사용.
| Graphic Raycaster |
|---|
 |
- UI를 생성하면 같이 생성되는 Canvas에 포함되어 있는 컴포넌트.
- 나중에 Physics Raycaster와 같이 학습이 필요할 듯.
종류
| 인터페이스 이름 | 사용 목적 | 포함된 메서드 |
|---|
| IPointerClickHandler | 포인터가 클릭되었을 때 | OnPointerClick(PointerEventData eventData) |
| IPointerDownHandler | 포인터가 오브젝트 위에서 눌러졌을 때 | OnPointerDown(PointerEventData eventData) |
| IPointerUpHandler | 포인터가 오브젝트 위에서 떼어졌을 때 | OnPointerUp(PointerEventData eventData) |
| IPointerEnterHandler | 포인터가 오브젝트의 충돌 범위 안으로 진입했을 때 | OnPointerEnter(PointerEventData eventData) |
| IPointerExitHandler | 포인터가 오브젝트의 충돌 범위 밖으로 나갔을 때 | OnPointerExit(PointerEventData eventData) |
| IDragHandler | 포인터가 눌린 상태에서 드래그될 때 | OnDrag(PointerEventData eventData) |
| IEndDragHandler | 드래그가 종료되었을 때 | OnEndDrag(PointerEventData eventData) |
장점
-
코드의 유연성 및 확장성
- 이벤트 처리를 위한 표준화된 계약을 제공하여, 다양한 오브젝트가 동일한 방식으로 포인터 이벤트에 반응하도록 만들 수 있음.
- 새로운 기능을 추가하거나 수정할 때 기존 코드를 최소한으로 변경할 수 있음.
-
명확한 역할 분리
- 해당 오브젝트가 어떤 종류의 포인터 이벤트를 처리하는지 직관적으로 파악할 수 있음.
-
유니티 이벤트 시스템과의 통합
- 유니티의 강력한 이벤트 시스템을 활용하여 복잡한 이벤트 처리 로직을 직접 구현할 필요 없이 안정적으로 입력 이벤트를 처리할 수 있음.
단점
-
UI 및 Event System 의존성 (레이캐스팅 필요)
- IPointer 인터페이스는 유니티의 Event System을 기반으로 작동하며, 주로 UGUI 요소와의 상호작용을 위해 설계됨.
- 이 인터페이스가 작동하려면 오브젝트에 Graphic Raycaster 또는 Physics Raycaster 컴포넌트가 존재해야 함.
- 3D 게임 오브젝트에 이 인터페이스를 적용할 경우, Physics Raycaster를 설정해야 하고, UI와 3D 오브젝트 간의 이벤트 우선순위 및 충돌 처리 로직을 별도로 관리해야 하므로 복잡해질 수 있음.
-
코드 결합도 증가 가능성
- 특정 이벤트를 처리하려면 스크립트가 해당 인터페이스(IPointerClickHandler 등)를 반드시 상속받고 메서드를 구현해야 함.
- 해당 스크립트가 이벤트 처리 로직을 갖도록 강제하여, 이벤트와 직접 관련 없는 로직이 하나의 컴포넌트에 섞이는 높은 결합도를 유발할 수 있음.
-
이벤트 전달 및 우선순위 관리
- UI가 중첩되어 있을 때, 이벤트는 가장 위에 있는 요소부터 처리됨.
- 만약 하위 UI 요소가 이벤트를 처리하고 소비하지 않으면, 이벤트가 뒤에 있는 UI 요소로 전달될 수 있음.
-
성능 오버헤드 (대규모 환경 시)
- Event System은 프레임마다 포인터의 위치에서 Raycasting을 수행하여 어떤 오브젝트와 충돌했는지 검사함.
- 캔버스 내의 UI 요소가 매우 많거나, IPointer 인터페이스를 사용하는 오브젝트가 화면에 대규모로 배치될 경우, 레이캐스팅 연산으로 인한 성능 오버헤드가 발생할 수 있음.
사용 예시
IPointerDownHandler
| Cell |
|---|
 |
 |
- OnCellClicked 델리게이트를 구현하여 작동 될 이벤트를 사용 용도에 따라 다르게 구현.
| ColorPuzzle |
|---|
 |
1. 기회 소모 메서드
2. 퍼즐 알고리즘 메서드
3. 퍼즐 해결 여부 판단 메서드
| DevStage |
|---|
 |
1. 셀 색 변경
IPointerEnterHandler
| Cell |
|---|
 |
 |
- OnCellHovered 델리게이트를 구현하여 작동 될 이벤트를 사용 용도에 따라 다르게 구현.
| StageDev |
|---|
 |
 |
- 마우스가 클릭 중인지 판단하는 _isHovered 변수가 true일 때, 색이 변경되는 메서드를 추가.
- 즉 목적은 드래그임.
- 드래그가 목적이지만 IDragHandler를 사용하지 않은 이유.
1. IDragHandler 포인터가 눌린 상태에서 드래그 될 때를 판단하기 때문에 다른 객체에서 포인터가 눌린 상태는 판별하지 못함.
2. 원하는 기능은 다른 객체에서 눌린 상태에서 드래그하는 기능이기 때문에 IPointerEnterHandler를 사용.