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
스크립트로 돌아가서, 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으로 구현하기 애매한 케이스에서 사용할 수 있을 것 같다.
'유니티' 카테고리의 다른 글
[Unity] 초당 프레임(FPS) 화면에 표시하기 (0) | 2022.11.08 |
---|---|
[Unity] 알아두면 유용한 Mathf 클래스 (1) | 2022.11.07 |
[Unity] 캔버스 마스크 / UI의 원하는 부분만 보이게 하기 (0) | 2022.11.06 |
[Unity] 마우스 뗄 때 이벤트가 발생하는 슬라이더 만들기 / IPointerUpHandler (0) | 2022.10.07 |
[Unity] Scene과 Game 화면이 다르게 나오는 경우 (1) | 2022.10.06 |