Reputation: 31
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;
}
}
Upvotes: 2
Views: 1942
Reputation: 129
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.
Upvotes: 1