using UnityEngine;
using System.Collections;
public struct SwipeAction
{
public SwipeDirection direction;
public Vector2 rawDirection;
public Vector2 startPosition;
public Vector2 endPosition;
public float startTime;
public float endTime;
public float duration;
public bool longPress;
public float distance;
public float longestDistance;
public override string ToString()
{
return string.Format("[SwipeAction: {0}, From {1}, To {2}, Delta {3}, Time {4:0.00}s]", direction, rawDirection, startPosition, endPosition, duration);
}
}
public enum SwipeDirection
{
None, // Basically means an invalid swipe
Up,
UpRight,
Right,
DownRight,
Down,
DownLeft,
Left,
UpLeft
}
///
/// Swipe manager.
/// BASED ON: http://forum.unity3d.com/threads/swipe-in-all-directions-touch-and-mouse.165416/#post-1516893
///
public class SwipeManager : MonoBehaviour
{
public System.Action onSwipe;
public System.Action onLongPress;
[Range(0f, 200f)]
public float minSwipeLength = 100f;
public float longPressDuration = 0.5f;
Vector2 currentSwipe;
SwipeAction currentSwipeAction = new SwipeAction();
void Update()
{
DetectSwipe();
}
public void DetectSwipe()
{
var touches = InputHelper.GetTouches();
if (touches.Count > 0)
{
Touch t = touches[0];
if (t.phase == TouchPhase.Began)
{
ResetCurrentSwipeAction(t);
}
if (t.phase == TouchPhase.Moved || t.phase == TouchPhase.Stationary)
{
UpdateCurrentSwipeAction(t);
if (!currentSwipeAction.longPress && currentSwipeAction.duration > longPressDuration && currentSwipeAction.longestDistance < minSwipeLength)
{
currentSwipeAction.direction = SwipeDirection.None; // Invalidate current swipe action
currentSwipeAction.longPress = true;
if (onLongPress != null)
{
onLongPress(currentSwipeAction); // Fire event
}
return;
}
}
if (t.phase == TouchPhase.Ended)
{
UpdateCurrentSwipeAction(t);
// Make sure it was a legit swipe, not a tap, or long press
if (currentSwipeAction.distance < minSwipeLength || currentSwipeAction.longPress) // Didnt swipe enough or this is a long press
{
currentSwipeAction.direction = SwipeDirection.None; // Invalidate current swipe action
return;
}
if (onSwipe != null)
{
onSwipe(currentSwipeAction); // Fire event
}
}
}
}
void ResetCurrentSwipeAction(Touch t)
{
currentSwipeAction.duration = 0f;
currentSwipeAction.distance = 0f;
currentSwipeAction.longestDistance = 0f;
currentSwipeAction.longPress = false;
currentSwipeAction.startPosition = new Vector2(t.position.x, t.position.y);
currentSwipeAction.startTime = Time.time;
currentSwipeAction.endPosition = currentSwipeAction.startPosition;
currentSwipeAction.endTime = currentSwipeAction.startTime;
}
void UpdateCurrentSwipeAction(Touch t)
{
currentSwipeAction.endPosition = new Vector2(t.position.x, t.position.y);
currentSwipeAction.endTime = Time.time;
currentSwipeAction.duration = currentSwipeAction.endTime - currentSwipeAction.startTime;
currentSwipe = currentSwipeAction.endPosition - currentSwipeAction.startPosition;
currentSwipeAction.rawDirection = currentSwipe;
currentSwipeAction.direction = GetSwipeDirection(currentSwipe);
currentSwipeAction.distance = Vector2.Distance(currentSwipeAction.startPosition, currentSwipeAction.endPosition);
if (currentSwipeAction.distance > currentSwipeAction.longestDistance) // If new distance is longer than previously longest
{
currentSwipeAction.longestDistance = currentSwipeAction.distance; // Update longest distance
}
}
SwipeDirection GetSwipeDirection(Vector2 direction)
{
var angle = Vector2.Angle(Vector2.up, direction.normalized); // Degrees
var swipeDirection = SwipeDirection.None;
if (direction.x > 0) // Right
{
if (angle < 22.5f) // 0.0 - 22.5
{
swipeDirection = SwipeDirection.Up;
}
else if (angle < 67.5f) // 22.5 - 67.5
{
swipeDirection = SwipeDirection.UpRight;
}
else if (angle < 112.5f) // 67.5 - 112.5
{
swipeDirection = SwipeDirection.Right;
}
else if (angle < 157.5f) // 112.5 - 157.5
{
swipeDirection = SwipeDirection.DownRight;
}
else if (angle < 180.0f) // 157.5 - 180.0
{
swipeDirection = SwipeDirection.Down;
}
}
else // Left
{
if (angle < 22.5f) // 0.0 - 22.5
{
swipeDirection = SwipeDirection.Up;
}
else if (angle < 67.5f) // 22.5 - 67.5
{
swipeDirection = SwipeDirection.UpLeft;
}
else if (angle < 112.5f) // 67.5 - 112.5
{
swipeDirection = SwipeDirection.Left;
}
else if (angle < 157.5f) // 112.5 - 157.5
{
swipeDirection = SwipeDirection.DownLeft;
}
else if (angle < 180.0f) // 157.5 - 180.0
{
swipeDirection = SwipeDirection.Down;
}
}
return swipeDirection;
}
}