[Unity] 스마트폰 멀티 터치(멀티 터치) 설치
17034 단어 Unity
입문
스마트폰의 멀티터치를 설치할 때 다음과 같은 문제가 발생했다.
실행 환경
주의사항
이 보도의 설치는 스마트폰의 실제 기기에서만 실행된다.편집기에서 실행되지 않습니다.
실시
사용품
사용UnityEngine.Touch.
Touch는 손가락이 화면에 닿는 상태에 대한 정보를 포함하는 구조입니다.
사용품
사용UnityEngine.Touch.
Touch는 손가락이 화면에 닿는 상태에 대한 정보를 포함하는 구조입니다.
터치는'손가락과 화면 사이에 생기는 스트레스'등의 정보도 가지고 있기 때문에 여기서는 처리하지 않지만'스트레스'등 재미있는 일을 사용할 수 있을지는 모른다.
기본 코드
Update()
내에 코드를 씁니다.코드 보기
void Update()
{
var touchCount = Input.touchCount;
for (var i = 0; i < touchCount; i++)
{
var touch = Input.GetTouch(i);
switch (touch.phase)
{
case TouchPhase.Began:
// 画面に指が触れた時に行いたい処理をここに書く
break;
case TouchPhase.Moved:
// 画面上で指が動いたときに行いたい処理をここに書く
break;
case TouchPhase.Stationary:
// 指が画面に触れているが動いてはいない時に行いたい処理をここに書く
break;
case TouchPhase.Ended:
// 画面から指が離れた時に行いたい処理をここに書く
break;
case TouchPhase.Canceled:
// システムがタッチの追跡をキャンセルした時に行いたい処理をここに書く
break;
default:
throw new ArgumentOutOfRangeException();
}
}
}
해설
먼저
var touchCount = Input.touchCount;
에서 기술한 장면은 다음 절차를 이용하여 명세표를 작성하여 개념 디자인에서 체량의 둘레를 분석하도록 한다.그리고 for 순환
touchCount
의 수량을 회전합니다.그리고
var touch = Input.GetTouch(i);
터치 스크린의 손가락 정보가 포함된 Touch 구조 인스턴스를 가져옵니다.마지막으로
touch.Phase
에서 "클릭한 손가락이 현재 어떤 상태"를 얻고 switch
에서 처리 지점을 만든다.응용 예시 (버튼 클릭 이동)
먼저 Button의 uGUI를 만들고 EventTrigger를 추가합니다.Button이라고 쓰여 있지만 EventTrigger를 사용하기 때문에 Button 구성 요소가 필요하지 않으므로 삭제하십시오.
버튼에 다음 이동 버튼 구성 요소를 추가합니다.
이동 버튼 코드 보기
using System;
using UnityEngine;
using UnityEngine.EventSystems;
public class MoveButton : MonoBehaviour
{
private RectTransform _rectTransform;
private int _fingerId = -1;
private void Awake()
{
_rectTransform = GetComponent<RectTransform>();
var eventTrigger = GetComponent<EventTrigger>();
var pointerDownEntry = new EventTrigger.Entry {eventID = EventTriggerType.PointerDown};
pointerDownEntry
.callback
.AddListener((data) => OnPointerDownDelegate((PointerEventData)data));
eventTrigger
.triggers
.Add(pointerDownEntry);
}
private void Update()
{
var touchCount = Input.touchCount;
if(touchCount <= 0)
return;
for (var i = 0; i < touchCount; i++)
{
var touch = Input.GetTouch(i);
if (touch.fingerId == _fingerId)
{
switch (touch.phase)
{
case TouchPhase.Began:
case TouchPhase.Moved:
case TouchPhase.Stationary:
_rectTransform.position = touch.position;
break;
case TouchPhase.Ended:
_fingerId = -1;
break;
case TouchPhase.Canceled:
break;
default:
throw new ArgumentOutOfRangeException();
}
}
}
}
private void OnPointerDownDelegate(PointerEventData data)
{
var touchCount = Input.touchCount;
switch (touchCount)
{
case 1:
{
var touch = Input.GetTouch(0);
_fingerId = touch.fingerId;
break;
}
case 2:
{
var touch0 = Input.GetTouch(0);
var touch1 = Input.GetTouch(1);
// タップしている2本の指のうち、適する方を選ぶ
var delta0 = math.lengthsq(touch0.position - data.position);
var delta1 = math.lengthsq(touch1.position - data.position);
var touch = delta0 < delta1 ? touch0 : touch1;
_fingerId = touch.fingerId;
break;
}
}
}
}
실기에서 실행하면 위의 GIF와 같다.
실제로 실행 중에는 Button 이외의 여분의 곳에서 클릭을 많이 했지만 특별한 간섭 없이 정상적으로 움직이고 있다.
두 개의 단추를 각각 이동할 수도 있다.
해설
유니티에서는 각자의 손가락을 추적하기 위해 화면을 클릭하는 순간 각자의 손가락에 id를 분배한다.
Touch-fingerId-Unity 스크립트 참조
버튼 클릭의 손가락을 다른 손가락과 구별해야 하기 때문에 _fingerId
버튼 클릭의 손가락 id를 관리하기로 했다.
손가락에 분배된 id는 0 이상의 정수이기 때문에 사용 가능성이 없음-1
초기화_fingerId
.Awake()
에서 Button을 누르면 실행되는 OnPointerDownDelegate()
함수를 등록합니다.
var touchCount = Input.touchCount;
화면에서 클릭한 손가락의 뿌리 수를 얻고 이 값에 따라 지점을 처리하여 얻는다_fingerId
.Update()
함수 내에서if (touch.fingerId == _fingerId)
{
/*...*/
}
이로써 _fingerId
와 일치하는 id의 손가락만 축소하고 touch.Phase
로 처리 지점을
_rectTransform.position = touch.position;
에 따라 Button을 클릭한 곳으로 이동합니다.
Button에서 손가락을 떼면 _fingerId
대입 -1
됩니다.
참고 문헌
using System;
using UnityEngine;
using UnityEngine.EventSystems;
public class MoveButton : MonoBehaviour
{
private RectTransform _rectTransform;
private int _fingerId = -1;
private void Awake()
{
_rectTransform = GetComponent<RectTransform>();
var eventTrigger = GetComponent<EventTrigger>();
var pointerDownEntry = new EventTrigger.Entry {eventID = EventTriggerType.PointerDown};
pointerDownEntry
.callback
.AddListener((data) => OnPointerDownDelegate((PointerEventData)data));
eventTrigger
.triggers
.Add(pointerDownEntry);
}
private void Update()
{
var touchCount = Input.touchCount;
if(touchCount <= 0)
return;
for (var i = 0; i < touchCount; i++)
{
var touch = Input.GetTouch(i);
if (touch.fingerId == _fingerId)
{
switch (touch.phase)
{
case TouchPhase.Began:
case TouchPhase.Moved:
case TouchPhase.Stationary:
_rectTransform.position = touch.position;
break;
case TouchPhase.Ended:
_fingerId = -1;
break;
case TouchPhase.Canceled:
break;
default:
throw new ArgumentOutOfRangeException();
}
}
}
}
private void OnPointerDownDelegate(PointerEventData data)
{
var touchCount = Input.touchCount;
switch (touchCount)
{
case 1:
{
var touch = Input.GetTouch(0);
_fingerId = touch.fingerId;
break;
}
case 2:
{
var touch0 = Input.GetTouch(0);
var touch1 = Input.GetTouch(1);
// タップしている2本の指のうち、適する方を選ぶ
var delta0 = math.lengthsq(touch0.position - data.position);
var delta1 = math.lengthsq(touch1.position - data.position);
var touch = delta0 < delta1 ? touch0 : touch1;
_fingerId = touch.fingerId;
break;
}
}
}
}
var touchCount = Input.touchCount;
if (touch.fingerId == _fingerId)
{
/*...*/
}
_rectTransform.position = touch.position;
Reference
이 문제에 관하여([Unity] 스마트폰 멀티 터치(멀티 터치) 설치), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/VeyronSakai/items/2261100eaf82619986f1텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)