게임에서 가장 많이 하는 클릭(터치)
언더테일이나 할로우나이트같은 게임을 제외하면 게임에서 제일 많이 하는게 클릭이 아닐까 싶다
그래서!!!! 클릭은 참 중요한데!!!
모바일 최적화 #1 (카드 터치, 드래그)
드디어 모바일에서도 게임이 작동되는것을 확인했다!!!! 하지만...갤볼에서 그렇게 고생했으면 이번엔 안할줄 알았는데...역시 이번에도 PC와 모바일 환경에서 이런저런 차이가 많이 보였고최적
sangeun00.tistory.com
최근 이 글을 쓰면서 같은 코드더라도 PC 환경과 모바일 환경에서 클릭이 작동되는게 다르구나라는 것을 알게 되었고
이참에 이것에 대해서 완벽 정리해보도록 하겠다
1. OnMouseUp/Down
우선 최근까지 코드에 썼던 OnMouseUp / Down
본론부터 말하자면 이건 모바일용 메서드가 아니다.
정확히는 터치보다 마우스 클릭을 감지하기 위한 메서드로 당연히 이걸 모바일 버전에서 사용하면 감지가 안될 수 있다
게다가 정확한 입력제어를 하기보다는 아주 간단하고 심플한 입력제어용으로 사용한다고 한다.
그렇기 때문에 굳이 모바일이 아니라 PC 게임을 만들 생각이라도 OnMouse 는 사용하지 않는걸 권장한다
아니 그럼 도대체 이건 왜 존재하는건데? 라는 생각이 들어 찾아보니


그렇다고 한다.
한줄요약 : OnMouse() 메서드는 클릭을 감지하는 빠르고 간단한 테스트 및 프로토타입 용도이다. 실전엔 안쓰는걸 권장
------------------------------------------------------
2. OnPointer
OnPointer은 Unity의 **EventSystem (이벤트 시스템)**이라는 강력한 기능의 일부이다.
- 포인터 (Pointer): 화면상의 위치를 가리키는 모든 입력 장치를 통틀어 부르는 말로, PC에서는 마우스 커서가 포인터고, 모바일에서는 손가락 터치 위치가 포인터이다.
- 결론: OnPointerDown은 포인터(마우스나 터치)가 UI 요소 위에서 막 눌리기 시작했을 때 딱 한 번 실행되는 함수이다.
클릭과 터치 모두 안정적으로 구현되도록 설계되었다!
*사용방법*
1. 인터페이스와 시스템 추가
using UnityEngine.EventSystems; 을 추가한뒤,
클래스 이름 옆에 IPointerDownHandler라는 인터페이스를 상속받도록 추가해준다
using UnityEngine;
using UnityEngine.EventSystems; // 👈 1. 꼭 추가해야 해요!
public class MyPointerHandler : MonoBehaviour, IPointerDownHandler // 👈 2. 이걸 상속받아야 해요!
{
// ...
}
2. OnPointerDown 메서드 추가
지금은 IPointerDownHandler를 상속받았으니,
약속된 함수인 OnPointerDown을 반드시 만들어야 한다.
public class MyPointerHandler : MonoBehaviour, IPointerDownHandler
{
// 포인터가 눌리는 순간 Unity가 이 함수를 호출해 줍니다.
public void OnPointerDown(PointerEventData eventData)
{
Debug.Log("🎉 터치(클릭) 시작! 오브젝트 이름: " + gameObject.name);
// 여기에 버튼을 눌렀을 때 시작될 동작을 코딩하면 됩니다.
// 예: 캐릭터의 점프 준비, 사운드 출력 등
}
}
3. 오브젝트에 부착하기
이 스크립트를 Canvas 아래에 있는 **Button**이나 Image 같은 UI 요소에 끌어다 붙이면 끝!
이제 게임을 실행하고 해당 UI 요소를 마우스로 누르거나 모바일에서 손가락으로 누르는 순간, OnPointerDown 함수가 실행된다.
* PointerEventData란? *
public void OnPointerDown(PointerEventData eventData)
함수의 괄호 안에 있는 PointerEventData eventData는 눌림 이벤트에 대한 자세한 정보가 담긴 상자라고 생각하면 된다

이제 이걸 이용하여 이런것도 가능하다
public void OnPointerDown(PointerEventData eventData)
{
if (eventData.button == PointerEventData.InputButton.Left)
{
Debug.Log("마우스 왼쪽 버튼으로 눌렀습니다!");
}
}
1. UI 요소에 대한 터치 (가장 권장)
버튼, 이미지 등 UI 요소를 클릭(터치) 처리할 때는 다음 인터페이스를 사용합니다.
- IPointerClickHandler: 터치(클릭)가 발생했을 때 호출됩니다.
- IPointerDownHandler: 터치가 시작될 때 (손가락을 누르는 순간) 호출됩니다.
- IPointerUpHandler: 터치가 끝날 때 (손가락을 떼는 순간) 호출됩니다.
using UnityEngine;
using UnityEngine.EventSystems;
public class MobileTouchButton : MonoBehaviour, IPointerClickHandler
{
// 클릭(터치 떼기)이 완료되었을 때 호출됩니다.
public void OnPointerClick(PointerEventData eventData)
{
Debug.Log("모바일 터치 클릭 완료!");
// 여기에 버튼 클릭 시 동작할 코드를 작성합니다.
}
}
사용법은 이렇다. IPointerClickHandler는 인터페이스
이걸 넣어준다면 OnPointerClick을 OnMouse처럼 쓸 수 있는 것이다
한줄요약 : 캔버스 요소 클릭에 있어서는 무조건 이거 써라
--------------------------------------------------
3. Raycast
캔버스 요소에서는 IPointer가 가장 적합한 선택이지만
게임속에 있는 캐릭터, 아이템등 오브젝트를 클릭할땐 Raycast가 가장 적합하다
Raycast(레이캐스트)란
"어떤 지점에서 특정 방향으로 보이지 않는 광선(Ray)을 쏘아, 그 광선이 맞닿는 첫 번째 물체를 찾는 기술"을 말한다.
마치 어둠 속에서 **손전등(Ray)**을 비춰서, 가장 먼저 빛이 닿는 물체가 무엇인지 확인하는 것과 같다.
컴퓨터는 화면을 클릭했을 때 클릭한 좌표만 알지,
그 좌표 뒤에 어떤 3D 물체가 있는지는 바로 알 수 없다. 그리고 Raycast는 이 문제를 해결해 준다.
* Raycast의 작동원리 *
1단계: Ray(광선) 정의하기
가장 먼저 광선(Ray)이 어디서 시작해서 어디로 향할지 정의해야 합니다.
- 시작 지점 (Origin): Ray가 출발하는 위치 (예: 카메라, 캐릭터의 손, 마우스 클릭 지점)
- 방향 (Direction): Ray가 나아갈 방향 (예: 앞으로, 아래로, 화면 정면으로)
2단계: Raycast 함수 실행하기
Unity의 Physics 클래스에는 Raycast 함수가 있습니다.
- 3D Raycast: Physics.**Raycast**()
- 2D Raycast: Physics2D.**Raycast**()
이 함수는 Ray를 쏘고, Ray가 어떤 물체와 충돌했는지 알려줍니다.
3단계: 충돌 정보 저장소 (RaycastHit)
Raycast 함수를 실행할 때, **RaycastHit**이라는 특별한 변수를 사용해서 충돌이 발생한 모든 정보를 저장합니다. 마치 충돌 결과가 담기는 상자 같아요.
// 3D Raycast 예시 (마우스 클릭 시)
void Update()
{
// 1. 마우스 왼쪽 버튼을 눌렀을 때
if (Input.GetMouseButtonDown(0))
{
// 2. 화면 클릭 위치에서 Ray 생성 (카메라에서 씬으로)
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit; // 3. 충돌 정보(결과)를 담을 상자
// 4. Raycast 실행! (최대 100 유닛 거리까지 검사)
if (Physics.Raycast(ray, out hit, 100f))
{
// 5. 충돌했다면 실행되는 코드 블록
Debug.Log("맞은 물체: " + hit.collider.gameObject.name);
// 맞은 물체의 위치를 가져옴
Vector3 point = hit.point;
}
}
}
이런식으로 구현코드를 짤 수 있다
여기서 중요한건 Raycast는 Collider 컴포넌트가 붙어있는 물체만 인식할 수 있다는 것.
물체에 Collider가 없다면, Ray는 그 물체를 투명한 것처럼 통과해 버린다!
'유니티 > 유니티 공부' 카테고리의 다른 글
| 타일맵 사용법 (0) | 2026.01.30 |
|---|---|
| 도트 필터 씌우기 - 렌더 텍스처(Render Texture) (1) | 2026.01.21 |
| JsonUtility (4) | 2025.08.19 |
| #3 C# 프로그래밍 (메서드, 간단한 코딩예시, 클래스,인스턴스,접근제한자,참조타입) (2) | 2025.03.17 |
| #2 유니티 엔진 동작 원리 (클래스,메서드,상속,컴포넌트, 브로드캐스팅, MonoBehavior) (0) | 2025.02.28 |