이 포스트에서는 유니티 엔진에서 오브젝트를 PC 환경에서 클릭 혹은 모바일에서 터치하는 방법을 알아본다.
2D를 기준으로 작성했다.
IPointerDownHandler와 IPointerUpHandler
먼저 오브젝트에 대한 터치를 구현하기 위해서는 위 두 인터페이스가 필요하다.
UnityEngine.EventSystems에서 제공되는 인터페이스로 각각의 역할은 다음과 같다.
IPointerDownHandler
대상 오브젝트를 눌렀을 때 호출되는 콜백이다.
IPointerUpHandler
대상 오브젝트를 눌렀다가 뗐을 때 호출되는 콜백이다.
사용자는 이 두 인터페이스를 활용하여 오브젝트를 터치할 때의 동작을 구현할 수 있다.
하지만 단순히 이 두 가지 인터페이스를 사용한다고 할 수 있는 건 아니고 아래 설명할 준비를 통해 콜백이 실행될 수 있도록 하는 환경을 갖춰야 한다.
사전 준비
메인 카메라에 Physics Raycaster 부착
메인 카메라에 Physics Raycaster 컴포넌트를 추가해야 한다.
Physics Raycaster는 위에서 설명한 EventSystems에서 제공하는 인터페이스에 반응할 수 있게 해주는 레이캐스터이다. 이 컴포넌트가 존재하지 않으면 당연히 이벤트 인터페이스가 호출되지 않으므로 꼭 추가한다.
이 포스트는 2D 오브젝트 터치를 구현할 것이므로 Physics2DRaycaster를 추가했다.
EventSystem 추가
레이캐스트가 작동하기 위해서는 씬에 EventSystem 컴포넌트가 필요하다.
게임 오브젝트 하나를 생성해서 EventSystem 컴포넌트를 추가하고 인풋 모듈을 설정해 주자.
대상 오브젝트에 콜라이더 추가
Physics Raycaster니까 당연히 터치 대상 오브젝트에 충돌을 감지할 콜라이더가 필요하니 추가한다.
Handler 인터페이스 구현
이제 IPointerDownHandler와 IPointerUpHandler를 구현하는 스크립트를 추가한다.
using UnityEngine.EventSystems;
using UnityEngine;
public class CircleObj : MonoBehaviour, IPointerDownHandler, IPointerUpHandler
{
public void OnPointerDown(PointerEventData eventData)
{
Debug.Log("Pointer Down");
}
public void OnPointerUp(PointerEventData eventData)
{
Debug.Log("Pointer Up");
}
}
여기까지 했으면 오브젝트에 스크립트를 추가하고 터치 결과를 지켜본다.
참고
IPointerUpHandler는 반드시 IPointerDownHandler가 같이 구현된 상태로 있어야 호출된다.
왜냐하면 OnPointerUp은 OnPointerDown이 발생한 오브젝트에 대해 호출되기 때문에 둘이 함께 구현되어야 하기 때문이다.
쉽게 말하면 다음과 같은 흐름을 가지므로 이전 콜백이 있어야 그다음도 호출된다고 이해할 수 있다.
OnPointerDown -> OnPointerUp
해당 오브젝트 위치에서 PointerUp 했음을 검사하기
개발하다 보면 OnPointerDown에서 동작을 처리하는 건 너무 민감하여 오브젝트 위에서 바로 터치를 뗐을 때만 처리를 하고 싶은 경우가 있을 수 있다.
그럴 때는 콜백의 인자로 넘어오는 PointerEventData 객체가 가지고 있는 데이터를 이용해 검사할 수 있다.
PointerEventData 객체에는 pointerEnter라는 프로퍼티가 있는데 현재 포인터가 위치한 곳에 있는 GameObject를 반환한다.
이를 이용해 포인터를 뗐을 때 pointerEnter가 자신과 일치하는지 아닌지를 검사하여 적절한 처리를 할 수 있다.
using UnityEngine.EventSystems;
using UnityEngine;
public class CircleObj : MonoBehaviour, IPointerDownHandler, IPointerUpHandler
{
public void OnPointerDown(PointerEventData eventData)
{
Debug.Log("Pointer Down");
}
public void OnPointerUp(PointerEventData eventData)
{
if (eventData.pointerEnter != gameObject)
{
return;
}
Debug.Log("Touch detected.");
}
}
이렇게 UnityEngine.EventSystems에서 제공하는 인터페이스를 통해 물체의 터치 혹은 클릭을 감지하는 방법을 알아봤다.
포스트의 내용을 잘 이용해서 오브젝트 터치 처리를 해보자.
'Unity Engine > 기초 테크닉' 카테고리의 다른 글
[Unity] 2D 오브젝트가 이동 중에 걸리는 현상 - Ghost Vertices (0) | 2024.11.10 |
---|---|
[Unity] 스프라이트 시트로 랜덤 파티클 만들기 (2) | 2024.11.07 |
[Unity] 스프라이트 뭉치로 애니메이션 만들기 (1) | 2024.11.05 |
[Unity] 유니티 오브젝트의 null 확인 (0) | 2023.09.03 |
유니티 Raycast로 3D 오브젝트 클릭과 드래그 (2) | 2022.09.20 |