简体   繁体   中英

Unity Swipe Functionality Issue

I'm having some troubles with creating swipe controls for a game. I'm trying to recreate the controls of the game Subway Surfers, where a swipe is detected during the Touch.Moved phase not the Touch.End phase. Right now it works most of the time but once in a while (to often) a vertical swipe will be processed as a horizontal one. I've posed the code below, thanks in advance for any help.

       int swipeIndex = -1; //index of first detected swipe to prevent multiple swipes
       Vector2 startPos = Vector.zero; //starting position of touch
       //minSwipeDist is the distance in inches the player must swipe for a correct swipe
       for (int i = 0; i < Input.touchCount; i++) {
            Touch touch = Input.touches[i];
            switch (touch.phase) {
                case TouchPhase.Began:
                    if (swipeIndex == -1) {
                        swipeIndex = i;
                        startPos = touch.position;
                    }
                    break;
                case TouchPhase.Moved:
                    if(i != swipeIndex)
                        break;
                    Vector2 direction = touch.position - startPos;
                    //vertical swipe
                    if (Mathf.Abs(direction.x) < Mathf.Abs(direction.y)) {
                        //swipe up
                        if ((touch.position.y - startPos.y) > minSwipeDist) {
                            //Process Up swipe
                            swipeIndex = -1;
                        }
                        //swipe down
                        else if ((touch.position.y - startPos.y) < -minSwipeDist) {
                            //Process down swipe
                            swipeIndex = -1;
                        }
                    }
                    //horizontal swipe
                    else {
                        //swipe left
                        if ((touch.position.x - startPos.x) < -minSwipeDist) {
                            //process left swipe
                            swipeIndex = -1;
                        }
                        //swipe right
                        else if ((touch.position.x - startPos.x) > minSwipeDist) {
                            //process right swipe
                            swipeIndex = -1;
                        }
                    }
                    break;
            }
        }

I think you should move your code from TouchPhase.Moved to TouchPhase.Ended. Basically you get touch point when TouchPhase.Began, and then you keep updating your second point in TouchPhase.Moved and then process the two points in TouchPhase.Ended.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM