Unity3d 触屏手机滑动事件(上下左右方向精确判断)

  • Post author:
  • Post category:其他


using UnityEngine;

namespace ui
{
    public class SlidingDirectionTest : MonoBehaviour
    {
        enum SlideVector
        {
            None,
            Up,
            Down,
            Left,
            Right
        };

        [SerializeField] private bool executeMultipleTimes = false; //是否支持多次执行
        [SerializeField] private float offsetTime = 0.1f; //判断的时间间隔 
        [SerializeField] private float slidingDistance = 80f; //滑动的最小距离

        private Vector2 touchFirst = Vector2.zero; //手指开始按下的位置

        private Vector2 touchSecond = Vector2.zero; //手指拖动的位置

        private SlideVector currentVector = SlideVector.None; //当前滑动方向

        private float timer; //时间计数器  

        void OnGUI()
        {
            if (Event.current.type == EventType.MouseDown)
            {
                touchFirst = Event.current.mousePosition;
            }

            if (Event.current.type == EventType.MouseDrag)
            {
                touchSecond = Event.current.mousePosition;

                timer += Time.deltaTime;

                if (timer > offsetTime)
                {
                    touchSecond = Event.current.mousePosition;
                    Vector2 slideDirection = touchFirst - touchSecond;
                    float x = slideDirection.x;
                    float y = slideDirection.y;

                    if (y + slidingDistance < x && y > -x - slidingDistance)
                    {
                        if (!executeMultipleTimes && currentVector == SlideVector.Left)
                        {
                            return;
                        }

                        Debug.Log("left");

                        currentVector = SlideVector.Left;
                    }
                    else if (y > x + slidingDistance && y < -x - slidingDistance)
                    {
                        if (!executeMultipleTimes && currentVector == SlideVector.Right)
                        {
                            // todo 看你是否需要多次执行 return是每次滑动仅执行一次
                            return;
                        }

                        Debug.Log("right");

                        currentVector = SlideVector.Right;
                    }
                    else if (y > x + slidingDistance && y - slidingDistance > -x)
                    {
                        if (!executeMultipleTimes && currentVector == SlideVector.Up)
                        {
                            return;
                        }

                        Debug.Log("up");

                        currentVector = SlideVector.Up;
                    }
                    else if (y + slidingDistance < x && y < -x - slidingDistance)
                    {
                        if (!executeMultipleTimes && currentVector == SlideVector.Down)
                        {
                            return;
                        }

                        Debug.Log("Down");

                        currentVector = SlideVector.Down;
                    }

                    timer = 0;
                    touchFirst = touchSecond;
                }
            }

            if (Event.current.type == EventType.MouseUp)
            {
                currentVector = SlideVector.None; //初始化方向  
            }
        }
    }
}



版权声明:本文为yzx5452830原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。