首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >检测滑动手势方向

检测滑动手势方向
EN

Stack Overflow用户
提问于 2017-01-06 02:03:16
回答 5查看 32.1K关注 0票数 11

这是我的代码,试图模拟一个滑动手势,所以当我构建到移动设备时,我知道它会工作。没有记录任何东西,我很困惑为什么它看起来不工作。我希望在控制台中打印出我刷了RTL (从右到左)或LTR (从左到右)。我看不出我做错了什么。

代码语言:javascript
复制
void Update()
{
    if (Input.GetMouseButtonDown(0))
    {
        startPosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);
    }
    if (Input.GetMouseButtonUp(0))
    {
        endPosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);
    }

    if (startPosition != endPosition && startPosition != Vector3.zero && endPosition != Vector3.zero)
    {
        float deltaX = endPosition.x - startPosition.x;
        float deltaY = endPosition.y - startPosition.y;
        if ((deltaX > 5.0f || deltaX < -5.0f) && (deltaY >= -1.0f || deltaY <= 1.0f))
        {
            if (startPosition.x < endPosition.x)
            {
                print("LTR");
            }
            else
            {
                print("RTL");
            }
        }
        startPosition = endPosition = Vector3.zero;
    }
}
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2017-01-06 06:41:44

我可以在你的代码中发现一些问题。将Vector3==!=进行比较并不是一个好主意。近似比较就可以了。您正在移动平台上使用Input.GetMouseButtonDown

您需要使用Input.touches来完成此操作。循环遍历它,将开始位置存储在TouchPhase.Began中,然后将结束位置存储在TouchPhase.Ended中。然后,您可以使用这两个变量来计算手指移动的方向。

下面的代码检测滑动方向,即使手指在TouchPhase.Moved的帮助下还没有释放。您可以通过启用detectSwipeOnlyAfterRelease布尔变量来禁用它。您还可以修改SWIPE_THRESHOLD以提高敏感度。

代码语言:javascript
复制
public class SwipeDetector : MonoBehaviour
{
    private Vector2 fingerDown;
    private Vector2 fingerUp;
    public bool detectSwipeOnlyAfterRelease = false;

    public float SWIPE_THRESHOLD = 20f;

    // Update is called once per frame
    void Update()
    {

        foreach (Touch touch in Input.touches)
        {
            if (touch.phase == TouchPhase.Began)
            {
                fingerUp = touch.position;
                fingerDown = touch.position;
            }

            //Detects Swipe while finger is still moving
            if (touch.phase == TouchPhase.Moved)
            {
                if (!detectSwipeOnlyAfterRelease)
                {
                    fingerDown = touch.position;
                    checkSwipe();
                }
            }

            //Detects swipe after finger is released
            if (touch.phase == TouchPhase.Ended)
            {
                fingerDown = touch.position;
                checkSwipe();
            }
        }
    }

    void checkSwipe()
    {
        //Check if Vertical swipe
        if (verticalMove() > SWIPE_THRESHOLD && verticalMove() > horizontalValMove())
        {
            //Debug.Log("Vertical");
            if (fingerDown.y - fingerUp.y > 0)//up swipe
            {
                OnSwipeUp();
            }
            else if (fingerDown.y - fingerUp.y < 0)//Down swipe
            {
                OnSwipeDown();
            }
            fingerUp = fingerDown;
        }

        //Check if Horizontal swipe
        else if (horizontalValMove() > SWIPE_THRESHOLD && horizontalValMove() > verticalMove())
        {
            //Debug.Log("Horizontal");
            if (fingerDown.x - fingerUp.x > 0)//Right swipe
            {
                OnSwipeRight();
            }
            else if (fingerDown.x - fingerUp.x < 0)//Left swipe
            {
                OnSwipeLeft();
            }
            fingerUp = fingerDown;
        }

        //No Movement at-all
        else
        {
            //Debug.Log("No Swipe!");
        }
    }

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

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

    //////////////////////////////////CALLBACK FUNCTIONS/////////////////////////////
    void OnSwipeUp()
    {
        Debug.Log("Swipe UP");
    }

    void OnSwipeDown()
    {
        Debug.Log("Swipe Down");
    }

    void OnSwipeLeft()
    {
        Debug.Log("Swipe Left");
    }

    void OnSwipeRight()
    {
        Debug.Log("Swipe Right");
    }
}
票数 28
EN

Stack Overflow用户

发布于 2019-03-22 19:08:40

感谢程序员,我采纳了他的建议,写了一个小组件,既可以使用鼠标,也可以使用触摸。鼠标将允许您在PC上调试应用程序。我还添加了以秒为单位的时间阈值,因为swipe不能太长。

代码语言:javascript
复制
using System;
using UnityEngine;
using UnityEngine.Events;

public class SwipeManager : MonoBehaviour {

  public float swipeThreshold = 50f;
  public float timeThreshold = 0.3f;

  public UnityEvent OnSwipeLeft;
  public UnityEvent OnSwipeRight;
  public UnityEvent OnSwipeUp;
  public UnityEvent OnSwipeDown;

  private Vector2 fingerDown;
  private DateTime fingerDownTime;
  private Vector2 fingerUp;
  private DateTime fingerUpTime;

  private void Update () {
    if (Input.GetMouseButtonDown(0)) {
      this.fingerDown = Input.mousePosition;
      this.fingerUp = Input.mousePosition;
      this.fingerDownTime = DateTime.Now;
    }
    if (Input.GetMouseButtonUp(0)) {
      this.fingerDown = Input.mousePosition;
      this.fingerUpTime = DateTime.Now;
      this.CheckSwipe();
    }
    foreach (Touch touch in Input.touches) {
      if (touch.phase == TouchPhase.Began) {
        this.fingerDown = touch.position;
        this.fingerUp = touch.position;
        this.fingerDownTime = DateTime.Now;
      }
      if (touch.phase == TouchPhase.Ended) {
        this.fingerDown = touch.position;
        this.fingerUpTime = DateTime.Now;
        this.CheckSwipe();
      }
    }
  }

  private void CheckSwipe() {
    float duration = (float)this.fingerUpTime.Subtract(this.fingerDownTime).TotalSeconds;
    if (duration > this.timeThreshold) return;

    float deltaX = this.fingerDown.x - this.fingerUp.x;
    if (Mathf.Abs(deltaX) > this.swipeThreshold) {
      if (deltaX > 0) {
        this.OnSwipeRight.Invoke();
        //Debug.Log("right");
      } else if (deltaX < 0) {
        this.OnSwipeLeft.Invoke();
        //Debug.Log("left");
      }
    }

    float deltaY = fingerDown.y - fingerUp.y;
    if (Mathf.Abs(deltaY) > this.swipeThreshold) {
      if (deltaY > 0) {
        this.OnSwipeUp.Invoke();
        //Debug.Log("up");
      } else if (deltaY < 0) {
        this.OnSwipeDown.Invoke();
        //Debug.Log("down");
      }
    }

    this.fingerUp = this.fingerDown;
  }
}
票数 10
EN

Stack Overflow用户

发布于 2019-12-17 07:29:44

修改了Developper的方法,以获得更精确的控制器(更少的代码!=D ):

代码语言:javascript
复制
using System;
using UnityEngine;
using UnityEngine.Events;
using Utilities;

public class SwipeManager : MonoBehaviour {

  public float swipeThreshold = 40f;
  public float timeThreshold = 0.3f;

  public UnityEvent onSwipeLeft;
  public UnityEvent onSwipeRight;
  public UnityEvent onSwipeUp;
  public UnityEvent onSwipeDown;

  private Vector2 _fingerDown;
  private DateTime _fingerDownTime;
  private Vector2 _fingerUp;
  private DateTime _fingerUpTime;

  private void Update () {
    if (Input.GetMouseButtonDown(0)) {
      _fingerDown = Input.mousePosition;
      _fingerUp = Input.mousePosition;
      _fingerDownTime = DateTime.Now;
    }

    if (Input.GetMouseButtonUp(0)) {
      _fingerDown = Input.mousePosition;
      _fingerUpTime = DateTime.Now;
      CheckSwipe();
    }

    foreach (var touch in Input.touches) {
      if (touch.phase == TouchPhase.Began) {
        _fingerDown = touch.position;
        _fingerUp = touch.position;
        _fingerDownTime = DateTime.Now;
      }

      if (touch.phase == TouchPhase.Ended) {
        _fingerDown = touch.position;
        _fingerUpTime = DateTime.Now;
        CheckSwipe();
      }
    }
  }

  private void CheckSwipe() {
    var duration = (float)_fingerUpTime.Subtract(_fingerDownTime).TotalSeconds;
    var dirVector = _fingerUp - _fingerDown;

    if (duration > timeThreshold) return;
    if (dirVector.magnitude < swipeThreshold) return;

    var direction = dirVector.Rotation(180f).Round();

    print(direction);

    if (direction >= 45 && direction < 135) onSwipeUp.Invoke();
    else if (direction >= 135 && direction < 225) onSwipeRight.Invoke();
    else if (direction >= 225 && direction < 315) onSwipeDown.Invoke();
    else if (direction >= 315 && direction < 360 || direction >= 0 && direction < 45) onSwipeLeft.Invoke();
  }
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41491765

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档