본문 바로가기

유니티

[Unity] 캔버스에서 클릭한 UI 이름 알아내기 / IPointerClickHandler / pointerCurrentRaycast

UI에 대한 마우스 클릭 이벤트를 감지하려면  IPointerClickHandler를 구현해야 한다.

해당 인터페이스는 OnPointerClick(PionterEventData pointerEventData) 메소드를 포함하고 있으며,

해당 메소드는 마우스 클릭 시 클릭 버튼, 클릭 횟수, 포인터 위치 등에 대한 정보를 담고 있다.

 

IPointerClickHandler를 사용하기 위해서는 아래 조건이 충족되어야 하는데,

캔버스 생성시 자동으로 추가/설정되는 항목이므로 참고만 하자.

  • Scene에 UI->EventSystems가 존재하는가? (마우스 입력을 받음)
  • 캔버스에 Graphic Raycaster가 존재하는가? (Raycast를 쏴줌)
  • 검출하려는 UI에 대해 Raycast Target이 체크되어 있는가? (Raycast에 반응함)

 

* 참고로 EventSystem이 마우스 클릭 등의 입력 이벤트를 보내면 이를 검출하는 수단이 Raycaster이다.

유니티 매뉴얼에 따르면 제공되는 Raycaster의 종류는 아래와 같다.

  • GraphicRaycaster - UI 요소로 사용하며, 캔버스에서 활용되어 캔버스 안을 검색
  • Physics2DRaycaster - 2D 물리 요소에 사용
  • PhysicsRaycaster - 3D 물리 요소에 사용

https://docs.unity3d.com/kr/530/Manual/Raycasters.html

 

레이캐스터 - Unity 매뉴얼

이벤트 시스템에는 현재의 입력 이벤트를 보낼 곳을 감지하는 메서드가 필요하며 레이캐스터(Raycasters)가 이러한 역할을 합니다. 스크린 공간 포지션을 감안하여 모든 잠재적인 타겟을 수집하고

docs.unity3d.com

 

스크립트로 돌아가서, IPointerClickHandler 인터페이스를 상속하면 마우스 클릭 이벤트를 받을 수 있고

OnPointerClick을 오버라이딩 해서 간단하게 클릭된 UI의 정보를 프린트하도록 했다.

PointerEventData 중 pointerCurrentRaycast에는 레이캐스트에 대한 정보가 포함되어 있어서

gameObject 말고도 worldPosition, screenPosition, depth 등의 정보를 추가로 얻을 수 있다.

 

using UnityEngine;
using UnityEngine.EventSystems;

public class UIClickTest : MonoBehaviour, IPointerClickHandler
{
    //Detect if a click occurs
    public void OnPointerClick(PointerEventData eventData)
    {
        GameObject clickedObject = eventData.pointerCurrentRaycast.gameObject;
        Debug.Log(clickedObject);
    }
}

 

위의 스크립트를 Canvas에 추가했기 때문에,

빈 공간이나 3D object 등을 클릭하면 아무런 동작을 하지 않는 것을 확인할 수 있고

Image 타입인 고라파덕과 야돈을 클릭하면 각각 해당 오브젝트의 이름을 출력하는 것을 볼 수 있다.

 

 

단순히 클릭 이벤트를 생각하면 Button으로 구현하는 것이 간단하겠지만

Button으로 구현하기 애매한 케이스에서 사용할 수 있을  것 같다.