使用协程的统一滑动输入

本文关键字:输入 | 更新日期: 2023-09-27 18:08:55

我正在使用以下代码行来准确检测四个方向的滑动,但我不明白为什么它不工作请帮助

void Update ()
{
    if (Input.GetKey(KeyCode.Joystick1Button9))
        Application.Quit();
    Dictionary<int, Touch> touch = new Dictionary<int, Touch>();
    foreach (Touch t in Input.touches)
    {
        Vector2 Direction = new Vector2(0,0);
        switch (t.phase)
        {
            case TouchPhase.Began:
                touch[t.fingerId] = t;
                Swiped = false;
                break;
            case TouchPhase.Ended:
                if (touch.ContainsKey(t.fingerId))
                {
                    Direction = t.position - touch[t.fingerId].position;
                    Direction = Direction.normalized;
                    Swiped = true;
                }
                else
                    Swiped = false;
                break;
            default :
                Swiped = false;
                break;
        }
        if (Swiped)
        {
            if (Vector2.Dot(Direction,Vector2.up) > Mathf.Sqrt(1/2f))
            {
                GameObject.FindObjectOfType<Light>().color = Color.red ;
                RandomObjects();
            }
            else if (Vector2.Dot(Direction, -1*Vector2.up) > Mathf.Sqrt(1/2f))
            {
                GameObject.FindObjectOfType<Light>().color = Color.green;
                RandomObjects();
            }
            else if (Vector2.Dot(Direction, Vector2.right) > Mathf.Sqrt(1/2f))
            {
                GameObject.FindObjectOfType<Light>().color = Color.blue;
                RandomObjects();
            }
            else if (Vector2.Dot(Direction,-1 * Vector2.right) > Mathf.Sqrt(1/2f))
            {
                GameObject.FindObjectOfType<Light>().color = Color.yellow;
                RandomObjects();
            }
        }
    }    
}

根据建议,我停止使用协程,并在Update()方法中编写代码。

使用协程的统一滑动输入

你的代码中有很多问题:

  1. 代码不工作,因为您在WaitForSeconds之后没有再次调用Input.GetTouch()
  2. 这是不是一个准确的滑动检测。严格来说,这根本不是一个滑动检测。如果您双击并在第二次点击时按住手指,您的代码将将其检测为滑动。但事实并非如此。此外,持续时间少于0.5秒的手势将不会被检测到。为了进行准确的手势检测,你需要持续分析用户的输入。

应该是这样的:

const float swipeThreshold = 100.0f;
IEnumerator SwipeInput(Action<Vector2> onSwipe)
{
    Dictionary<int, Touch> activeTouches = new Dictionary<int, Touch>();
    Dictionary<int, Vector3> activeButtons = new Dictionary<int, Vector3>();
    while (true)
    {
        if (Input.touches.Length > 0)
            foreach (Touch touch in Input.touches)
                switch (touch.phase)
                {
                    case TouchPhase.Began:
                        activeTouches[touch.fingerId] = touch;
                        break;
                    case TouchPhase.Ended:
                        if (activeTouches.ContainsKey(touch.fingerId))
                        {
                            Vector2 delta = touch.position - activeTouches[touch.fingerId].position;
                            if (delta.magnitude > swipeThreshold)
                                onSwipe(delta);
                        }
                        break;
                }
        else
            for (int i = 0; i <= 2; ++i)
            {
                if (Input.GetMouseButtonDown(i))
                    activeButtons[i] = Input.mousePosition;
                else if (Input.GetMouseButtonUp(i) && activeButtons.ContainsKey(i))
                {
                    Vector2 delta = Input.mousePosition - activeButtons[i];
                    if (delta.magnitude > swipeThreshold)
                        onSwipe(delta);
                }
            }
        yield return new WaitForFixedUpdate();
    }
}

注:协程看起来很酷。但不要把它用在你能想到的所有事情上。否则你最终会努力去同步它们。只有在你真正需要的时候才使用它们。也就是说,当使用它们时,会产生更清晰、紧凑或优雅的代码。例如,手势检测就不是这种情况。