[Unity] 스마트폰 멀티 터치(멀티 터치) 설치

17034 단어 Unity

입문


스마트폰의 멀티터치를 설치할 때 다음과 같은 문제가 발생했다.
  • 두 손가락으로 가볍게 두드리면 가볍게 두드리는 두 점의 중간 위치를 얻는다.
  • 여러 손가락이 가볍게 두드리거나 화면에서 옮겨질 때 각 손가락이 서로 간섭하여 의외의 조작을 초래한다.
  • 이 글은 이런 문제점을 해결하고 스마트폰 멀티터치 조작에 필요한 정보를 정리했다.

    실행 환경

  • macOS Catalina 10.15.2
  • Unity 2019.3.0f3
  • 그러나 최신 기능과 라이브러리를 사용하지 않기 때문에 구 버전의 유니티라도 잘 진행될 수 있을 것이다.

    주의사항


    이 보도의 설치는 스마트폰의 실제 기기에서만 실행된다.편집기에서 실행되지 않습니다.

    실시


    사용품


    사용UnityEngine.Touch.
    Touch는 손가락이 화면에 닿는 상태에 대한 정보를 포함하는 구조입니다.
  • 터치스크린 손가락 수
  • 해당 손가락을 식별하는 id
  • 각 손가락의 상태(두드림, 이동, 정지, 손가락 놓기 등)
  • 따라서 화면을 만지는 여러 손가락을 각각 추적할 수 있다.
    터치는'손가락과 화면 사이에 생기는 스트레스'등의 정보도 가지고 있기 때문에 여기서는 처리하지 않지만'스트레스'등 재미있는 일을 사용할 수 있을지는 모른다.

    기본 코드

    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 됩니다.

    참고 문헌

  • UnityEngine.Touch-Nity 스크립트 참조
  • how to make multi-touch - Unity Answers
  • How to implement multi touch in android 2d game? - Unity Answers
  • 좋은 웹페이지 즐겨찾기