본문 바로가기
Unity/Basic

유니티 모바일 터치(Mobile Touch)

by 노튜 2020. 9. 11.
728x90
반응형

1. 모바일 터치 (Mobile Touch)

모바일은 터치 방식으로 사용자의 입력을 받는다. 사용자는 화면을 클릭하여 모바일에서 동작하는 애플리케인션을 조작한다. 이는 기존의 데스크탑 컴퓨터의 마우스 입력과 다르다. 터치 방식은 사용자가 스크린을 손가락 또는 모바일 펜과 같은 보조 도구를 사용하여 직접 스크린을 조작하기에 멀티 터치가 가능하다.  

유니티에서 입력 처리는 Input이 담당한다. 모바일 디바이스의 경우, Input 클래스를 통해 터치스크린, 가속 센서, 지리/위치정보 입력 등에 접근할 수 있다. iPhone과 iPad Touch 디바이스에서는 최대 5점 터치 동작을 인식할 수 있다. 안드로이드 디바이스는 디바이스마다 다르며, 2점 터치부터 최대 5점 터치 동작을 인식할 수 있다[1].

 

사용자가 입력한 터치 정보는 Input.touches 프로퍼티 배열을 사용해 접근할 수있다.

Touch[] touches = Touch.touches;

 

2. Touch

Input 클래스는 Touch 구조체로 데이터를 저장한다.  

2.1 Properties

  • fingerId : 터치 인덱스로, 몇 번째 터치 인지를 나타낸다.
  • positon : 터치 위치로, 스크린 좌표이다.
  • deltaPosition : 이전 프레임 이후 터치가 이동한 정도이다.
  • phase : 현재 터치의 단계를 나타낸다. 시작, 이동 등을 알 수 있다.
  • ...

2.2 Phase

터치의 단계를 나타낸다. 

 

  • Begin : 터치가 발생한 단계
  • Moved : 터치가 발생한 후 터치가 이동한 단계  ex) Drag
  • Stationary : 터치가 발생한 후 이전 프레임 다음에 어떠한 동작도 발생하지 않은 단계
  • Ended : 터치가 종료한 단계, 손가락이 스크린으로부터 떨어졌을 때 
  • Canceled : 시스템이 터치 상태를 더 이상 추적하지 않을 때.
반응형

3. Input.GetTouch(int index)

모든 터치 정보를 일일이 받아와 처리할 필요는 없다. 필요한 터치 정보는 GetTouch() 함수를 사용해 얻어온다. 

GetTouch()의 파라미터(int index)는 몇 번째 터치인지를 나타내는 터치 인덱스이다. 0의 값은 1번째 터치를 의미한다.   

Touch touchFirst = Input.GetTouch(0);
Touch touchSecond = Input.GetTouch(1);

 

4. World Positon

터치가 발생한 위치의 월드 포지션은 스크린 포인트에서 레이(Ray)를 발사해 값을 얻을 수 있다. 레이를 사용하는 이유는 스크린 포인트는 월드 포지션과 다르기 때문이다. 레이는 시작 지점부터 특정방향으로 그려진 라인으로 카메라(Camera)의 함수를 사용하면 쉽게 값을 얻을 수 있다. 

ScreenPointToRay(Vector3 positon);
ScreenPointToRay(Vector3 position, Camera.MonoStereoscopicEye eye);

 

Input 클래스를 사용해 얻어온 터치의 위치를 ScreenPointToRay의 포지션 값으로 사용한다. 

Touch touch = Input.GetTouch(0);
Ray ray = Camera.main.ScreenPointToRay(touch.position);

 

ScreenPointToRay() 함수를 사용해 얻어온 Ray의 값은 Physcis 클래스를 사용하여 레이캐스트를 한다.  

 

using UnityEngine;

public class MyTouch : MonoBehaviour
{
   public LayerMask layerMask;
   public float rayDistance = 100.0f;
   private Camera mainCamera;
   // Start is called before the first frame update
   void Start()
   {
      mainCamera = Camera.main;
   }
   // Update is called once per frame
   void Update()
   {
      Ray ray = mainCamera.ScreenPointToRay(Input.GetTouch(0).position);
      if(Physcis.Raycast(ray, out RaycastHit raycastHit, rayDistance, layerMask)
      {
         // Todo something if ray hit.
         // Debug.Log("HitPoint:" + rarycasHit.point);
      }
   }
}

 

728x90

 

References

[1] Mobile Input

https://docs.unity3d.com/kr/2018.4/Manual/MobileInput.html

 

모바일 디바이스 입력 - Unity 매뉴얼

모바일 디바이스의 경우, Input 클래스를 통해 터치스크린, 가속 센서, 지리/위치정보 입력 등에 액세스할 수 있습니다.

docs.unity3d.com

 

728x90
반응형