Unityでスワイプを検知する

November 01, 2021

はじめに

Unityでモバイルアプリを作成する際に、スワイプを検知する方法について調べました。

スワイプ検知

下記コード1をGameObjectにアタッチするとスワイプを検知できます。

DetectSwipe.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SwipeDetector : MonoBehaviour
{
    private Vector2 fingerDown;
    private Vector2 fingerUp;

    // 指を離したときだけ処理を行う
    public bool detectSwipeOnlyAfterRelease = false;

    // しきい値以上スワイプするとスワイプとして検知する
    public float SWIPE_THRESHOLD = 20f;

    void Update()
    {

        foreach (Touch touch in Input.touches)
        {
            // スワイプをし始めた位置を記録する
            if (touch.phase == TouchPhase.Began)
            {
                fingerUp = touch.position;
                fingerDown = touch.position;
            }

            if (touch.phase == TouchPhase.Moved)
            {
                if (!detectSwipeOnlyAfterRelease)
                {
                    fingerDown = touch.position;
                    checkSwipe();
                }
            }

            if (touch.phase == TouchPhase.Ended)
            {
                fingerDown = touch.position;
                checkSwipe();
            }
        }
    }

    void checkSwipe()
    {
        // しきい値以上縦方向にスワイプしたかどうか判定する
        if (verticalMove() > SWIPE_THRESHOLD && verticalMove() > horizontalValMove())
        {
            if (fingerDown.y - fingerUp.y > 0)
            {
                OnSwipeUp();
            }
            else if (fingerDown.y - fingerUp.y < 0)
            {
                OnSwipeDown();
            }
            fingerUp = fingerDown;
        }

        // しきい値以上横方向にスワイプしたかどうか判定する
        else if (horizontalValMove() > SWIPE_THRESHOLD && horizontalValMove() > verticalMove())
        {
            if (fingerDown.x - fingerUp.x > 0)
            {
                OnSwipeRight();
            }
            else if (fingerDown.x - fingerUp.x < 0)
            {
                OnSwipeLeft();
            }
            fingerUp = fingerDown;
        }
    }

    float verticalMove()
    {
        return Mathf.Abs(fingerDown.y - fingerUp.y);
    }

    float horizontalValMove()
    {
        return Mathf.Abs(fingerDown.x - fingerUp.x);
    }

    void OnSwipeUp()
    {
    }

    void OnSwipeDown()
    {
    }

    void OnSwipeLeft()
    {
    }

    void OnSwipeRight()
    {
    }
}

参考


プロフィール画像

nabehide Software Developer, Tokyo Japan @____nabehide