using UnityEngine; using System.Collections; /// /// Swipe gesture: quick drag/drop motion and release in a cardinal direction (e.g. a page flip with the finger) /// [AddComponentMenu( "FingerGestures/Gesture Recognizers/Swipe" )] public class SwipeGestureRecognizer : AveragedGestureRecognizer { /// /// Event fired when a valid swipe gesture has been detected, upon release of the finger(s) /// See also: , /// public event EventDelegate OnSwipe; /// /// Directions we want the swipe recognizer to detect /// public FingerGestures.SwipeDirection ValidDirections = FingerGestures.SwipeDirection.All; /// /// Minimum swipe distance /// public float MinDistance = 1.0f; /// /// Minimum swipe velocity /// public float MinVelocity = 1.0f; /// /// Amount of tolerance when determining if the finger motion was performed along one of the supported swipe directions. /// This amount should be kept between 0 and 0.5f, where 0 means no tolerance and 0.5f means you can move within 45 degrees away from the allowed direction /// public float DirectionTolerance = 0.0f; //DOT Vector2 move; FingerGestures.SwipeDirection direction = FingerGestures.SwipeDirection.None; float velocity = 0; /// /// Get the total move from start position to last/current position /// public Vector2 Move { get { return move; } private set { move = value; } } /// /// Get the swipe direction detected /// public FingerGestures.SwipeDirection Direction { get { return direction; } } /// /// Get the current swipe velocity (in screen units per second) /// public float Velocity { get { return velocity; } } /// /// Return true if the input direction is supported /// public bool IsValidDirection( FingerGestures.SwipeDirection dir ) { if( dir == FingerGestures.SwipeDirection.None ) return false; return ( ( ValidDirections & dir ) == dir ); } protected override bool CanBegin( FingerGestures.IFingerList touches ) { if( !base.CanBegin( touches ) ) return false; if( touches.GetAverageDistanceFromStart() < 0.5f ) return false; return true; } protected override void OnBegin( FingerGestures.IFingerList touches ) { MinDistance = 10; MinVelocity = 1; DirectionTolerance = 0.5f; Position = touches.GetAveragePosition(); StartPosition = Position; direction = FingerGestures.SwipeDirection.None; } protected override GestureState OnActive( FingerGestures.IFingerList touches ) { if( touches.Count != RequiredFingerCount ) { // fingers were lifted off if( touches.Count < RequiredFingerCount ) { if( direction != FingerGestures.SwipeDirection.None ) { if( OnSwipe != null ) OnSwipe( this ); return GestureState.Recognized; } } return GestureState.Failed; } Position = touches.GetAveragePosition(); Move = Position - StartPosition; float distance = Move.magnitude; // didnt move far enough if( distance < MinDistance ) return GestureState.InProgress; if( ElapsedTime > 0 ) velocity = distance / ElapsedTime; else velocity = 0; // we're going too slow if( velocity < MinVelocity ) return GestureState.Failed; FingerGestures.SwipeDirection newDirection = FingerGestures.GetSwipeDirection( Move.normalized, DirectionTolerance ); // we went in a bad direction if( !IsValidDirection( newDirection ) || ( direction != FingerGestures.SwipeDirection.None && newDirection != direction ) ) return GestureState.Failed; direction = newDirection; return GestureState.InProgress; } }