2209 lines
70 KiB
C#
2209 lines
70 KiB
C#
/***********************************************
|
|
EasyTouch V
|
|
Copyright © 2014-2015 The Hedgehog Team
|
|
http://www.thehedgehogteam.com/Forum/
|
|
|
|
The.Hedgehog.Team@gmail.com
|
|
|
|
**********************************************/
|
|
|
|
using UnityEngine;
|
|
using UnityEngine.EventSystems;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
|
|
namespace HedgehogTeam.EasyTouch{
|
|
/// <summary>
|
|
/// This is the main class of Easytouch engine.
|
|
///
|
|
/// For add Easy Touch to your scene
|
|
/// It is a fake singleton, so you can simply access their settings via a script with all static methods or with the inspector.<br>
|
|
/// </summary>
|
|
public class EasyTouch : MonoBehaviour {
|
|
|
|
#region private classes
|
|
[System.Serializable]
|
|
private class DoubleTap{
|
|
public bool inDoubleTap = false;
|
|
public bool inWait = false;
|
|
public float time=0;
|
|
public int count=0;
|
|
public Finger finger;
|
|
|
|
public void Stop(){
|
|
inDoubleTap = false;
|
|
inWait = false;
|
|
time=0;
|
|
count=0;
|
|
}
|
|
}
|
|
|
|
private class PickedObject{
|
|
public GameObject pickedObj;
|
|
public Camera pickedCamera;
|
|
public bool isGUI;
|
|
}
|
|
#endregion
|
|
|
|
#region Delegate
|
|
public delegate void TouchCancelHandler(Gesture gesture);
|
|
public delegate void Cancel2FingersHandler(Gesture gesture);
|
|
public delegate void TouchStartHandler(Gesture gesture);
|
|
public delegate void TouchDownHandler(Gesture gesture);
|
|
public delegate void TouchUpHandler(Gesture gesture);
|
|
public delegate void SimpleTapHandler(Gesture gesture);
|
|
public delegate void DoubleTapHandler(Gesture gesture);
|
|
public delegate void LongTapStartHandler(Gesture gesture);
|
|
public delegate void LongTapHandler(Gesture gesture);
|
|
public delegate void LongTapEndHandler(Gesture gesture);
|
|
public delegate void DragStartHandler(Gesture gesture);
|
|
public delegate void DragHandler(Gesture gesture);
|
|
public delegate void DragEndHandler(Gesture gesture);
|
|
public delegate void SwipeStartHandler(Gesture gesture);
|
|
public delegate void SwipeHandler(Gesture gesture);
|
|
public delegate void SwipeEndHandler(Gesture gesture);
|
|
public delegate void TouchStart2FingersHandler(Gesture gesture);
|
|
public delegate void TouchDown2FingersHandler(Gesture gesture);
|
|
public delegate void TouchUp2FingersHandler(Gesture gesture);
|
|
public delegate void SimpleTap2FingersHandler(Gesture gesture);
|
|
public delegate void DoubleTap2FingersHandler(Gesture gesture);
|
|
public delegate void LongTapStart2FingersHandler(Gesture gesture);
|
|
public delegate void LongTap2FingersHandler(Gesture gesture);
|
|
public delegate void LongTapEnd2FingersHandler(Gesture gesture);
|
|
public delegate void TwistHandler(Gesture gesture);
|
|
public delegate void TwistEndHandler(Gesture gesture);
|
|
public delegate void PinchInHandler(Gesture gesture);
|
|
public delegate void PinchOutHandler(Gesture gesture);
|
|
public delegate void PinchEndHandler(Gesture gesture);
|
|
public delegate void PinchHandler(Gesture gesture);
|
|
public delegate void DragStart2FingersHandler(Gesture gesture);
|
|
public delegate void Drag2FingersHandler(Gesture gesture);
|
|
public delegate void DragEnd2FingersHandler(Gesture gesture);
|
|
public delegate void SwipeStart2FingersHandler(Gesture gesture);
|
|
public delegate void Swipe2FingersHandler(Gesture gesture);
|
|
public delegate void SwipeEnd2FingersHandler(Gesture gesture);
|
|
public delegate void EasyTouchIsReadyHandler();
|
|
|
|
public delegate void OverUIElementHandler( Gesture gesture);
|
|
public delegate void UIElementTouchUpHandler( Gesture gesture);
|
|
#endregion
|
|
|
|
#region Events
|
|
/// <summary>
|
|
/// Occurs when The system cancelled tracking for the touch, as when (for example) the user puts the device to her face.
|
|
/// </summary>
|
|
public static event TouchCancelHandler On_Cancel;
|
|
/// <summary>
|
|
/// Occurs when the touch count is no longer egal to 2 and different to 0, after the begining of a two fingers gesture.
|
|
/// </summary>
|
|
public static event Cancel2FingersHandler On_Cancel2Fingers;
|
|
/// <summary>
|
|
/// Occurs when a finger touched the screen.
|
|
/// </summary>
|
|
public static event TouchStartHandler On_TouchStart;
|
|
/// <summary>
|
|
/// Occurs as the touch is active.
|
|
/// </summary>
|
|
public static event TouchDownHandler On_TouchDown;
|
|
/// <summary>
|
|
/// Occurs when a finger was lifted from the screen.
|
|
/// </summary>
|
|
public static event TouchUpHandler On_TouchUp;
|
|
/// <summary>
|
|
/// Occurs when a finger was lifted from the screen, and the time elapsed since the beginning of the touch is less than the time required for the detection of a long tap.
|
|
/// </summary>
|
|
public static event SimpleTapHandler On_SimpleTap;
|
|
/// <summary>
|
|
/// Occurs when the number of taps is egal to 2 in a short time.
|
|
/// </summary>
|
|
public static event DoubleTapHandler On_DoubleTap;
|
|
/// <summary>
|
|
/// Occurs when a finger is touching the screen, but hasn't moved since the time required for the detection of a long tap.
|
|
/// </summary>
|
|
public static event LongTapStartHandler On_LongTapStart;
|
|
/// <summary>
|
|
/// Occurs as the touch is active after a LongTapStart
|
|
/// </summary>
|
|
public static event LongTapHandler On_LongTap;
|
|
/// <summary>
|
|
/// Occurs when a finger was lifted from the screen, and the time elapsed since the beginning of the touch is more than the time required for the detection of a long tap.
|
|
/// </summary>
|
|
public static event LongTapEndHandler On_LongTapEnd;
|
|
/// <summary>
|
|
/// Occurs when a drag start. A drag is a swipe on a pickable object
|
|
/// </summary>
|
|
public static event DragStartHandler On_DragStart;
|
|
/// <summary>
|
|
/// Occurs as the drag is active.
|
|
/// </summary>
|
|
public static event DragHandler On_Drag;
|
|
/// <summary>
|
|
/// Occurs when a finger that raise the drag event , is lifted from the screen.
|
|
/// </summary>/
|
|
public static event DragEndHandler On_DragEnd;
|
|
/// <summary>
|
|
/// Occurs when swipe start.
|
|
/// </summary>
|
|
public static event SwipeStartHandler On_SwipeStart;
|
|
/// <summary>
|
|
/// Occurs as the swipe is active.
|
|
/// </summary>
|
|
public static event SwipeHandler On_Swipe;
|
|
/// <summary>
|
|
/// Occurs when a finger that raise the swipe event , is lifted from the screen.
|
|
/// </summary>
|
|
public static event SwipeEndHandler On_SwipeEnd;
|
|
/// <summary>
|
|
/// Like On_TouchStart but for a 2 fingers gesture.
|
|
/// </summary>
|
|
public static event TouchStart2FingersHandler On_TouchStart2Fingers;
|
|
/// <summary>
|
|
/// Like On_TouchDown but for a 2 fingers gesture.
|
|
/// </summary>
|
|
public static event TouchDown2FingersHandler On_TouchDown2Fingers;
|
|
/// <summary>
|
|
/// Like On_TouchUp but for a 2 fingers gesture.
|
|
/// </summary>
|
|
public static event TouchUp2FingersHandler On_TouchUp2Fingers;
|
|
/// <summary>
|
|
/// Like On_SimpleTap but for a 2 fingers gesture.
|
|
/// </summary>
|
|
public static event SimpleTap2FingersHandler On_SimpleTap2Fingers;
|
|
/// <summary>
|
|
/// Like On_DoubleTap but for a 2 fingers gesture.
|
|
/// </summary>
|
|
public static event DoubleTap2FingersHandler On_DoubleTap2Fingers;
|
|
/// <summary>
|
|
/// Like On_LongTapStart but for a 2 fingers gesture.
|
|
/// </summary>
|
|
public static event LongTapStart2FingersHandler On_LongTapStart2Fingers;
|
|
/// <summary>
|
|
/// Like On_LongTap but for a 2 fingers gesture.
|
|
/// </summary>
|
|
public static event LongTap2FingersHandler On_LongTap2Fingers;
|
|
/// <summary>
|
|
/// Like On_LongTapEnd but for a 2 fingers gesture.
|
|
/// </summary>
|
|
public static event LongTapEnd2FingersHandler On_LongTapEnd2Fingers;
|
|
/// <summary>
|
|
/// Occurs when a twist gesture start
|
|
/// </summary>
|
|
public static event TwistHandler On_Twist;
|
|
/// <summary>
|
|
/// Occurs as the twist gesture is active.
|
|
/// </summary>
|
|
public static event TwistEndHandler On_TwistEnd;
|
|
/// <summary>
|
|
/// Occurs as the pinch gesture is active.
|
|
/// </summary>
|
|
public static event PinchHandler On_Pinch;
|
|
/// <summary>
|
|
/// Occurs as the pinch in gesture is active.
|
|
/// </summary>
|
|
public static event PinchInHandler On_PinchIn;
|
|
/// <summary>
|
|
/// Occurs as the pinch out gesture is active.
|
|
/// </summary>
|
|
public static event PinchOutHandler On_PinchOut;
|
|
/// <summary>
|
|
/// Occurs when the 2 fingers that raise the pinch event , are lifted from the screen.
|
|
/// </summary>
|
|
public static event PinchEndHandler On_PinchEnd;
|
|
/// <summary>
|
|
/// Like On_DragStart but for a 2 fingers gesture.
|
|
/// </summary>
|
|
public static event DragStart2FingersHandler On_DragStart2Fingers;
|
|
/// <summary>
|
|
/// Like On_Drag but for a 2 fingers gesture.
|
|
/// </summary>
|
|
public static event Drag2FingersHandler On_Drag2Fingers;
|
|
/// <summary>
|
|
/// Like On_DragEnd2Fingers but for a 2 fingers gesture.
|
|
/// </summary>
|
|
public static event DragEnd2FingersHandler On_DragEnd2Fingers;
|
|
/// <summary>
|
|
/// Like On_SwipeStart but for a 2 fingers gesture.
|
|
/// </summary>
|
|
public static event SwipeStart2FingersHandler On_SwipeStart2Fingers;
|
|
/// <summary>
|
|
/// Like On_Swipe but for a 2 fingers gesture.
|
|
/// </summary>
|
|
public static event Swipe2FingersHandler On_Swipe2Fingers;
|
|
/// <summary>
|
|
/// Like On_SwipeEnd but for a 2 fingers gesture.
|
|
/// </summary>
|
|
public static event SwipeEnd2FingersHandler On_SwipeEnd2Fingers;
|
|
/// <summary>
|
|
/// Occurs when easy touch is ready.
|
|
/// </summary>
|
|
public static event EasyTouchIsReadyHandler On_EasyTouchIsReady;
|
|
/// <summary>
|
|
/// Occurs when current touch is over user interface element.
|
|
/// </summary>
|
|
public static event OverUIElementHandler On_OverUIElement;
|
|
|
|
public static event UIElementTouchUpHandler On_UIElementTouchUp;
|
|
#endregion
|
|
|
|
#region Enumerations
|
|
|
|
public enum GesturePriority{ Tap, Slips};
|
|
|
|
public enum DoubleTapDetection { BySystem, ByTime}
|
|
|
|
public enum GestureType{ Tap, Drag, Swipe, None, LongTap, Pinch, Twist, Cancel, Acquisition };
|
|
/// <summary>
|
|
/// Represents the different directions for a swipe or drag gesture (Left, Right, Up, Down, Other)
|
|
///
|
|
/// The direction is influenced by the swipe Tolerance parameter Look at SetSwipeTolerance( float tolerance)
|
|
/// <br><br>
|
|
/// This enumeration is used on Gesture class
|
|
/// </summary>
|
|
public enum SwipeDirection{ None, Left, Right, Up, Down, UpLeft, UpRight, DownLeft, DownRight,Other,All};
|
|
|
|
public enum TwoFingerPickMethod{ Finger, Average};
|
|
|
|
public enum EvtType{ None,On_TouchStart,On_TouchDown,On_TouchUp,On_SimpleTap,On_DoubleTap,On_LongTapStart,On_LongTap,
|
|
On_LongTapEnd,On_DragStart,On_Drag,On_DragEnd,On_SwipeStart,On_Swipe,On_SwipeEnd,On_TouchStart2Fingers,On_TouchDown2Fingers,On_TouchUp2Fingers,On_SimpleTap2Fingers,
|
|
On_DoubleTap2Fingers,On_LongTapStart2Fingers,On_LongTap2Fingers,On_LongTapEnd2Fingers,On_Twist,On_TwistEnd,On_Pinch,On_PinchIn,On_PinchOut,On_PinchEnd,On_DragStart2Fingers,
|
|
On_Drag2Fingers,On_DragEnd2Fingers,On_SwipeStart2Fingers,On_Swipe2Fingers,On_SwipeEnd2Fingers, On_EasyTouchIsReady ,On_Cancel, On_Cancel2Fingers,On_OverUIElement, On_UIElementTouchUp}
|
|
|
|
#endregion
|
|
|
|
#region Public members
|
|
private static EasyTouch _instance;
|
|
public static EasyTouch instance{
|
|
get{
|
|
if( !_instance ){
|
|
|
|
// check if an ObjectPoolManager is already available in the scene graph
|
|
_instance = FindObjectOfType( typeof( EasyTouch ) ) as EasyTouch;
|
|
|
|
// nope, create a new one
|
|
if( !_instance ){
|
|
GameObject obj = new GameObject( "Easytouch" );
|
|
_instance = obj.AddComponent<EasyTouch>();
|
|
}
|
|
}
|
|
|
|
return _instance;
|
|
}
|
|
}
|
|
|
|
private Gesture _currentGesture = new Gesture();
|
|
public static Gesture current{
|
|
get{
|
|
return EasyTouch.instance._currentGesture;
|
|
}
|
|
}
|
|
|
|
private List<Gesture> _currentGestures = new List<Gesture>();
|
|
|
|
public bool enable; // Enables or disables Easy Touch
|
|
public bool enableRemote; // Enables or disables Unity remote
|
|
|
|
// General gesture properties
|
|
public GesturePriority gesturePriority;
|
|
public float StationaryTolerance;//
|
|
public float longTapTime ; // The time required for the detection of a long tap.
|
|
public float swipeTolerance; // Determines the accuracy of detecting a drag movement 0 => no precision 1=> high precision.
|
|
public float minPinchLength; // The minimum length for a pinch detection.
|
|
public float minTwistAngle; // The minimum angle for a twist detection.
|
|
public DoubleTapDetection doubleTapDetection;
|
|
public float doubleTapTime;
|
|
public bool alwaysSendSwipe;
|
|
//public bool isDpi;
|
|
|
|
// Two finger gesture
|
|
public bool enable2FingersGesture; // Enables 2 fingers gesture.
|
|
public bool enableTwist; // Enables or disables recognition of the twist
|
|
public bool enablePinch; // Enables or disables recognition of the Pinch
|
|
public bool enable2FingersSwipe; // Enables or disables recognition of 2 fingers swipe
|
|
public TwoFingerPickMethod twoFingerPickMethod;
|
|
|
|
// Auto selection
|
|
public List<ECamera> touchCameras; // The cameras
|
|
public bool autoSelect; // Enables or disables auto select
|
|
public LayerMask pickableLayers3D; // Layer detectable by default
|
|
public bool enable2D; // Enables or disables auto select on 2D
|
|
public LayerMask pickableLayers2D;
|
|
public bool autoUpdatePickedObject;
|
|
|
|
// Unity UI
|
|
//public EasyTouchRaycaster uiRaycaster;
|
|
public bool allowUIDetection;
|
|
public bool enableUIMode;
|
|
public bool autoUpdatePickedUI;
|
|
|
|
// NGUI
|
|
public bool enabledNGuiMode; // True = no events are send when touch is hover an NGui panel
|
|
public LayerMask nGUILayers;
|
|
public List<Camera> nGUICameras;
|
|
|
|
// Second Finger
|
|
public bool enableSimulation;
|
|
public KeyCode twistKey;
|
|
public KeyCode swipeKey;
|
|
|
|
// Inspector
|
|
public bool showGuiInspector = false;
|
|
public bool showSelectInspector = false;
|
|
public bool showGestureInspector = false;
|
|
public bool showTwoFingerInspector = false;
|
|
public bool showSecondFingerInspector = false;
|
|
#endregion
|
|
|
|
#region Private members
|
|
private EasyTouchInput input = new EasyTouchInput();
|
|
private Finger[] fingers=new Finger[100]; // The informations of the touch for finger 1.
|
|
public Texture secondFingerTexture; // The texture to display the simulation of the second finger.
|
|
private TwoFingerGesture twoFinger = new TwoFingerGesture();
|
|
private int oldTouchCount=0;
|
|
private DoubleTap[] singleDoubleTap = new DoubleTap[100];
|
|
private Finger[] tmpArray = new Finger[100];
|
|
private PickedObject pickedObject = new PickedObject();
|
|
|
|
// Unity UI
|
|
private List<RaycastResult> uiRaycastResultCache= new List<RaycastResult>();
|
|
private PointerEventData uiPointerEventData;
|
|
private EventSystem uiEventSystem;
|
|
|
|
#endregion
|
|
|
|
#region Constructor
|
|
public EasyTouch(){
|
|
enable = true;
|
|
|
|
allowUIDetection = true;
|
|
enableUIMode = true;
|
|
autoUpdatePickedUI = false;
|
|
|
|
enabledNGuiMode = false;
|
|
nGUICameras = new List<Camera>();
|
|
|
|
autoSelect = true;
|
|
touchCameras = new List<ECamera>();
|
|
pickableLayers3D = 1<<0;
|
|
enable2D = false;
|
|
pickableLayers2D = 1<<0;
|
|
|
|
gesturePriority = GesturePriority.Tap;
|
|
StationaryTolerance = 15;
|
|
longTapTime =1;
|
|
doubleTapDetection = DoubleTapDetection.BySystem;
|
|
doubleTapTime = 0.3f;
|
|
swipeTolerance = 0.85f;
|
|
alwaysSendSwipe = false;
|
|
|
|
enable2FingersGesture=true;
|
|
twoFingerPickMethod = TwoFingerPickMethod.Finger;
|
|
enable2FingersSwipe = true;
|
|
enablePinch = true;
|
|
minPinchLength = 0f;
|
|
enableTwist = true;
|
|
minTwistAngle = 0f;
|
|
|
|
enableSimulation = true;
|
|
twistKey = KeyCode.LeftAlt;
|
|
swipeKey = KeyCode.LeftControl;
|
|
|
|
|
|
}
|
|
#endregion
|
|
|
|
#region MonoBehaviour Callback
|
|
void OnEnable(){
|
|
if (Application.isPlaying && Application.isEditor){
|
|
Init();
|
|
}
|
|
}
|
|
|
|
void Awake(){
|
|
Init();
|
|
}
|
|
|
|
void Start(){
|
|
|
|
for (int i=0;i<100;i++){
|
|
singleDoubleTap[i] = new DoubleTap();
|
|
}
|
|
int index = touchCameras.FindIndex(
|
|
delegate(ECamera c){
|
|
return c.camera == Camera.main;
|
|
}
|
|
);
|
|
|
|
if (index<0)
|
|
touchCameras.Add(new ECamera(Camera.main,false));
|
|
|
|
// Fire ready event
|
|
if (On_EasyTouchIsReady!=null){
|
|
On_EasyTouchIsReady();
|
|
}
|
|
|
|
// Current gesture
|
|
_currentGestures.Add( new Gesture());
|
|
}
|
|
|
|
void Init(){
|
|
|
|
// The texture to display the simulation of the second finger.
|
|
#if ((!UNITY_ANDROID && !UNITY_IOS && !UNITY_TVOS && !UNITY_WINRT && !UNITY_BLACKBERRY) || UNITY_EDITOR)
|
|
if (secondFingerTexture==null && enableSimulation){
|
|
secondFingerTexture =Resources.Load("secondFinger") as Texture;
|
|
}
|
|
#endif
|
|
}
|
|
|
|
// Display the simulation of the second finger
|
|
#if ((!UNITY_ANDROID && !UNITY_IOS && !UNITY_TVOS && !UNITY_WINRT && !UNITY_BLACKBERRY) || UNITY_EDITOR)
|
|
void OnGUI(){
|
|
if (enableSimulation && !enableRemote){
|
|
Vector2 finger = input.GetSecondFingerPosition();
|
|
if (finger!=new Vector2(-1,-1)){
|
|
GUI.DrawTexture( new Rect(finger.x-16,Screen.height-finger.y-16,32,32),secondFingerTexture);
|
|
}
|
|
}
|
|
}
|
|
#endif
|
|
|
|
void OnDrawGizmos(){
|
|
}
|
|
|
|
// Non comments.
|
|
void Update(){
|
|
|
|
|
|
if (enable && EasyTouch.instance==this){
|
|
|
|
//#if (UNITY_EDITOR )
|
|
if (Application.isPlaying && Input.touchCount>0){
|
|
enableRemote = true;
|
|
}
|
|
|
|
if (Application.isPlaying && Input.touchCount==0){
|
|
enableRemote = false;
|
|
}
|
|
|
|
|
|
//#endif
|
|
|
|
int i;
|
|
|
|
// How many finger do we have ?
|
|
int count = input.TouchCount();
|
|
|
|
// Reset after two finger gesture;
|
|
if (oldTouchCount==2 && count!=2 && count>0){
|
|
CreateGesture2Finger(EvtType.On_Cancel2Fingers,Vector2.zero,Vector2.zero,Vector2.zero,0,SwipeDirection.None,0,Vector2.zero,0,0,0);
|
|
}
|
|
|
|
// Get touches
|
|
#if (((UNITY_ANDROID || UNITY_IOS || UNITY_WINRT || UNITY_BLACKBERRY || UNITY_TVOS) && !UNITY_EDITOR))
|
|
UpdateTouches(true, count);
|
|
#else
|
|
UpdateTouches(false, count);
|
|
#endif
|
|
|
|
// two fingers gesture
|
|
twoFinger.oldPickedObject = twoFinger.pickedObject;
|
|
if (enable2FingersGesture){
|
|
if (count==2){
|
|
TwoFinger();
|
|
}
|
|
}
|
|
|
|
// Other fingers gesture
|
|
for (i=0;i<100;i++){
|
|
if (fingers[i]!=null){
|
|
OneFinger(i);
|
|
}
|
|
}
|
|
|
|
oldTouchCount = count;
|
|
}
|
|
}
|
|
|
|
void LateUpdate(){
|
|
|
|
// single gesture
|
|
if (_currentGestures.Count>1){
|
|
_currentGestures.RemoveAt(0);
|
|
}
|
|
else{
|
|
_currentGestures[0] = new Gesture();
|
|
}
|
|
_currentGesture = _currentGestures[0];
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
void UpdateTouches(bool realTouch, int touchCount){
|
|
|
|
fingers.CopyTo( tmpArray,0);
|
|
|
|
if (realTouch || enableRemote){
|
|
ResetTouches();
|
|
for (var i = 0; i < touchCount; ++i) {
|
|
Touch touch = Input.GetTouch(i);
|
|
|
|
int t=0;
|
|
while (t < 100 && fingers[i]==null){
|
|
if (tmpArray[t] != null){
|
|
if ( tmpArray[t].fingerIndex == touch.fingerId){
|
|
fingers[i] = tmpArray[t];
|
|
}
|
|
}
|
|
t++;
|
|
}
|
|
|
|
if (fingers[i]==null){
|
|
fingers[i]= new Finger();
|
|
fingers[i].fingerIndex = touch.fingerId;
|
|
fingers[i].gesture = GestureType.None;
|
|
fingers[i].phase = TouchPhase.Began;
|
|
}
|
|
else{
|
|
fingers[i].phase = touch.phase;
|
|
}
|
|
|
|
if ( fingers[i].phase!= TouchPhase.Began){
|
|
fingers[i].deltaPosition = touch.position - fingers[i].position;
|
|
}
|
|
else{
|
|
fingers[i].deltaPosition = Vector2.zero;
|
|
}
|
|
|
|
fingers[i].position = touch.position;
|
|
//fingers[i].deltaPosition = touch.deltaPosition;
|
|
fingers[i].tapCount = touch.tapCount;
|
|
fingers[i].deltaTime = touch.deltaTime;
|
|
|
|
fingers[i].touchCount = touchCount;
|
|
|
|
#if UNITY_5_3
|
|
fingers[i].altitudeAngle = touch.altitudeAngle;
|
|
fingers[i].azimuthAngle = touch.azimuthAngle;
|
|
fingers[i].maximumPossiblePressure = touch.maximumPossiblePressure;
|
|
fingers[i].pressure = touch.pressure;
|
|
fingers[i].radius = touch.radius;
|
|
fingers[i].radiusVariance = touch.radiusVariance;
|
|
fingers[i].touchType = touch.type;
|
|
#endif
|
|
}
|
|
}
|
|
else{
|
|
int i=0;
|
|
while (i<touchCount){
|
|
fingers[i] = input.GetMouseTouch(i,fingers[i]) as Finger;
|
|
fingers[i].touchCount = touchCount;
|
|
i++;
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
void ResetTouches(){
|
|
for (int i=0;i<100;i++){
|
|
fingers[i] = null;
|
|
}
|
|
}
|
|
#endregion
|
|
|
|
#region One finger Private methods
|
|
private void OneFinger(int fingerIndex){
|
|
|
|
// A tap starts ?
|
|
if ( fingers[fingerIndex].gesture==GestureType.None){
|
|
|
|
if (!singleDoubleTap[fingerIndex].inDoubleTap){
|
|
singleDoubleTap[fingerIndex].inDoubleTap = true;
|
|
singleDoubleTap[fingerIndex].time = 0;
|
|
singleDoubleTap[fingerIndex].count = 1;
|
|
}
|
|
|
|
fingers[fingerIndex].startTimeAction = Time.realtimeSinceStartup;
|
|
fingers[fingerIndex].gesture=GestureType.Acquisition;
|
|
fingers[fingerIndex].startPosition = fingers[fingerIndex].position;
|
|
|
|
// do we touch a pickable gameobject ?
|
|
if (autoSelect){
|
|
if (GetPickedGameObject(fingers[fingerIndex])){
|
|
fingers[fingerIndex].pickedObject = pickedObject.pickedObj;
|
|
fingers[fingerIndex].isGuiCamera = pickedObject.isGUI;
|
|
fingers[fingerIndex].pickedCamera = pickedObject.pickedCamera;
|
|
}
|
|
}
|
|
|
|
// UnityGUI
|
|
if (allowUIDetection){
|
|
fingers[fingerIndex].isOverGui = IsScreenPositionOverUI( fingers[fingerIndex].position );
|
|
fingers[fingerIndex].pickedUIElement = GetFirstUIElementFromCache();
|
|
}
|
|
|
|
// we notify a touch
|
|
CreateGesture(fingerIndex, EvtType.On_TouchStart,fingers[fingerIndex], SwipeDirection.None,0,Vector2.zero);
|
|
}
|
|
|
|
if (singleDoubleTap[fingerIndex].inDoubleTap) singleDoubleTap[fingerIndex].time += Time.deltaTime;
|
|
|
|
// Calculates the time since the beginning of the action.
|
|
fingers[fingerIndex].actionTime = Time.realtimeSinceStartup - fingers[fingerIndex].startTimeAction;
|
|
|
|
|
|
// touch canceled?
|
|
if (fingers[fingerIndex].phase == TouchPhase.Canceled){
|
|
fingers[fingerIndex].gesture = GestureType.Cancel;
|
|
}
|
|
|
|
if (fingers[fingerIndex].phase != TouchPhase.Ended && fingers[fingerIndex].phase != TouchPhase.Canceled){
|
|
|
|
// Are we stationary for a long tap
|
|
if (fingers[fingerIndex].phase == TouchPhase.Stationary &&
|
|
fingers[fingerIndex].actionTime >= longTapTime && fingers[fingerIndex].gesture == GestureType.Acquisition){
|
|
|
|
fingers[fingerIndex].gesture = GestureType.LongTap;
|
|
CreateGesture(fingerIndex, EvtType.On_LongTapStart,fingers[fingerIndex], SwipeDirection.None,0,Vector2.zero);
|
|
}
|
|
|
|
// Let's move us?
|
|
if (( (fingers[fingerIndex].gesture == GestureType.Acquisition ||fingers[fingerIndex].gesture == GestureType.LongTap) && fingers[fingerIndex].phase == TouchPhase.Moved && gesturePriority == GesturePriority.Slips)
|
|
|| ((fingers[fingerIndex].gesture == GestureType.Acquisition ||fingers[fingerIndex].gesture == GestureType.LongTap) && (FingerInTolerance(fingers[fingerIndex])==false) && gesturePriority == GesturePriority.Tap ))
|
|
{
|
|
|
|
// long touch => cancel
|
|
if (fingers[fingerIndex].gesture == GestureType.LongTap){
|
|
fingers[fingerIndex].gesture = GestureType.Cancel;
|
|
CreateGesture(fingerIndex, EvtType.On_LongTapEnd,fingers[fingerIndex],SwipeDirection.None,0,Vector2.zero);
|
|
// Init the touch to start
|
|
fingers[fingerIndex].gesture=GestureType.Acquisition;
|
|
}
|
|
else{
|
|
fingers[fingerIndex].oldSwipeType = SwipeDirection.None;
|
|
|
|
// If an object is selected we drag
|
|
if (fingers[fingerIndex].pickedObject){
|
|
fingers[fingerIndex].gesture = GestureType.Drag;
|
|
CreateGesture(fingerIndex, EvtType.On_DragStart,fingers[fingerIndex],SwipeDirection.None,0, Vector2.zero);
|
|
|
|
if (alwaysSendSwipe){
|
|
CreateGesture(fingerIndex, EvtType.On_SwipeStart,fingers[fingerIndex], SwipeDirection.None,0,Vector2.zero);
|
|
}
|
|
}
|
|
// If not swipe
|
|
else{
|
|
fingers[fingerIndex].gesture = GestureType.Swipe;
|
|
CreateGesture(fingerIndex, EvtType.On_SwipeStart,fingers[fingerIndex], SwipeDirection.None,0,Vector2.zero);
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
// Gesture update
|
|
EvtType message = EvtType.None;
|
|
|
|
switch (fingers[fingerIndex].gesture){
|
|
case GestureType.LongTap:
|
|
message=EvtType.On_LongTap;
|
|
break;
|
|
case GestureType.Drag:
|
|
message=EvtType.On_Drag;
|
|
break;
|
|
case GestureType.Swipe:
|
|
message=EvtType.On_Swipe;
|
|
break;
|
|
}
|
|
|
|
// Send gesture
|
|
SwipeDirection currentSwipe = SwipeDirection.None;
|
|
currentSwipe = GetSwipe(new Vector2(0,0),fingers[fingerIndex].deltaPosition);
|
|
if (message!=EvtType.None){
|
|
|
|
fingers[fingerIndex].oldSwipeType = currentSwipe;
|
|
CreateGesture(fingerIndex, message,fingers[fingerIndex], currentSwipe ,0,fingers[fingerIndex].deltaPosition);
|
|
|
|
if (message == EvtType.On_Drag && alwaysSendSwipe){
|
|
CreateGesture(fingerIndex, EvtType.On_Swipe,fingers[fingerIndex], currentSwipe ,0,fingers[fingerIndex].deltaPosition);
|
|
}
|
|
}
|
|
|
|
// TouchDown
|
|
CreateGesture(fingerIndex, EvtType.On_TouchDown,fingers[fingerIndex], currentSwipe,0,fingers[fingerIndex].deltaPosition);
|
|
}
|
|
else{
|
|
// End of the touch
|
|
switch (fingers[fingerIndex].gesture){
|
|
// tap
|
|
case GestureType.Acquisition:
|
|
|
|
if (doubleTapDetection == DoubleTapDetection.BySystem){
|
|
if (FingerInTolerance(fingers[fingerIndex])){
|
|
if (fingers[fingerIndex].tapCount<2){
|
|
CreateGesture( fingerIndex, EvtType.On_SimpleTap,fingers[fingerIndex], SwipeDirection.None,0,Vector2.zero);
|
|
}
|
|
else{
|
|
CreateGesture( fingerIndex, EvtType.On_DoubleTap,fingers[fingerIndex], SwipeDirection.None,0,Vector2.zero);
|
|
}
|
|
|
|
}
|
|
}
|
|
else{
|
|
if (!singleDoubleTap[fingerIndex].inWait){
|
|
singleDoubleTap[fingerIndex].finger = fingers[fingerIndex];
|
|
StartCoroutine(SingleOrDouble(fingerIndex) );
|
|
}
|
|
else{
|
|
singleDoubleTap[fingerIndex].count++;
|
|
}
|
|
}
|
|
|
|
break;
|
|
// long tap
|
|
case GestureType.LongTap:
|
|
CreateGesture( fingerIndex, EvtType.On_LongTapEnd,fingers[fingerIndex], SwipeDirection.None,0,Vector2.zero);
|
|
break;
|
|
// drag
|
|
case GestureType.Drag:
|
|
CreateGesture(fingerIndex, EvtType.On_DragEnd,fingers[fingerIndex], GetSwipe(fingers[fingerIndex].startPosition,fingers[fingerIndex].position), (fingers[fingerIndex].startPosition-fingers[fingerIndex].position).magnitude,fingers[fingerIndex].position-fingers[fingerIndex].startPosition);
|
|
if (alwaysSendSwipe){
|
|
CreateGesture( fingerIndex, EvtType.On_SwipeEnd,fingers[fingerIndex], GetSwipe(fingers[fingerIndex].startPosition, fingers[fingerIndex].position), (fingers[fingerIndex].position-fingers[fingerIndex].startPosition).magnitude,fingers[fingerIndex].position-fingers[fingerIndex].startPosition);
|
|
}
|
|
break;
|
|
// swipe
|
|
case GestureType.Swipe:
|
|
CreateGesture( fingerIndex, EvtType.On_SwipeEnd,fingers[fingerIndex], GetSwipe(fingers[fingerIndex].startPosition, fingers[fingerIndex].position), (fingers[fingerIndex].position-fingers[fingerIndex].startPosition).magnitude,fingers[fingerIndex].position-fingers[fingerIndex].startPosition);
|
|
break;
|
|
|
|
// cancel
|
|
case GestureType.Cancel:
|
|
CreateGesture(fingerIndex, EvtType.On_Cancel,fingers[fingerIndex],SwipeDirection.None,0,Vector2.zero);
|
|
break;
|
|
|
|
}
|
|
CreateGesture( fingerIndex, EvtType.On_TouchUp,fingers[fingerIndex], SwipeDirection.None,0,Vector2.zero);
|
|
fingers[fingerIndex]=null;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
IEnumerator SingleOrDouble(int fingerIndex){
|
|
singleDoubleTap[fingerIndex].inWait = true;
|
|
float time2Wait = doubleTapTime-singleDoubleTap[fingerIndex].finger.actionTime;
|
|
if (time2Wait<0) time2Wait =0;
|
|
yield return new WaitForSeconds(time2Wait);
|
|
|
|
|
|
if (singleDoubleTap[fingerIndex].count <2){
|
|
//CreateGesture( fingerIndex, EvtType.On_SimpleTap,singleDoubleTap[fingerIndex].finger, SwipeDirection.None,0,Vector2.zero);
|
|
CreateGesture( fingerIndex, EvtType.On_SimpleTap,singleDoubleTap[fingerIndex].finger, SwipeDirection.None,0,singleDoubleTap[fingerIndex].finger.deltaPosition);
|
|
}
|
|
else{
|
|
//CreateGesture( fingerIndex, EvtType.On_DoubleTap,singleDoubleTap[fingerIndex].finger, SwipeDirection.None,0,Vector2.zero);
|
|
CreateGesture( fingerIndex, EvtType.On_DoubleTap,singleDoubleTap[fingerIndex].finger, SwipeDirection.None,0,singleDoubleTap[fingerIndex].finger.deltaPosition);
|
|
}
|
|
|
|
//fingers[fingerIndex]=null;
|
|
singleDoubleTap[fingerIndex].Stop();
|
|
StopCoroutine( "SingleOrDouble");
|
|
}
|
|
|
|
private void CreateGesture(int touchIndex,EvtType message,Finger finger, SwipeDirection swipe, float swipeLength, Vector2 swipeVector){
|
|
|
|
bool firingEvent = true;
|
|
|
|
if (autoUpdatePickedUI && allowUIDetection){
|
|
finger.isOverGui = IsScreenPositionOverUI( finger.position );
|
|
finger.pickedUIElement = GetFirstUIElementFromCache();
|
|
}
|
|
|
|
// NGui
|
|
if (enabledNGuiMode && message == EvtType.On_TouchStart){
|
|
finger.isOverGui = finger.isOverGui || IsTouchOverNGui(finger.position);
|
|
}
|
|
|
|
// firing event ?
|
|
if ((enableUIMode || enabledNGuiMode)){
|
|
firingEvent = !finger.isOverGui;
|
|
}
|
|
|
|
// The new gesture
|
|
Gesture gesture = finger.GetGesture();
|
|
|
|
// Auto update picked object
|
|
if (autoUpdatePickedObject && autoSelect){
|
|
if (message != EvtType.On_Drag && message != EvtType.On_DragEnd && message != EvtType.On_DragStart){
|
|
if (GetPickedGameObject(finger)){
|
|
gesture.pickedObject = pickedObject.pickedObj;
|
|
gesture.pickedCamera = pickedObject.pickedCamera;
|
|
gesture.isGuiCamera = pickedObject.isGUI;
|
|
}
|
|
else{
|
|
gesture.pickedObject = null;
|
|
gesture.pickedCamera = null;
|
|
gesture.isGuiCamera = false;
|
|
}
|
|
}
|
|
}
|
|
|
|
gesture.swipe = swipe;
|
|
gesture.swipeLength = swipeLength;
|
|
gesture.swipeVector = swipeVector;
|
|
|
|
gesture.deltaPinch = 0;
|
|
gesture.twistAngle = 0;
|
|
|
|
|
|
// Firing event
|
|
if ( firingEvent){
|
|
RaiseEvent(message, gesture);
|
|
}
|
|
else if (finger.isOverGui){
|
|
if (message == EvtType.On_TouchUp){
|
|
RaiseEvent(EvtType.On_UIElementTouchUp, gesture);
|
|
}
|
|
else{
|
|
RaiseEvent(EvtType.On_OverUIElement, gesture);
|
|
}
|
|
}
|
|
|
|
}
|
|
#endregion
|
|
|
|
#region Two finger private methods
|
|
private void TwoFinger(){
|
|
|
|
bool move=false;
|
|
|
|
// A touch starts
|
|
if ( twoFinger.currentGesture==GestureType.None){
|
|
|
|
if (!singleDoubleTap[99].inDoubleTap){
|
|
singleDoubleTap[99].inDoubleTap = true;
|
|
singleDoubleTap[99].time = 0;
|
|
singleDoubleTap[99].count = 1;
|
|
}
|
|
|
|
twoFinger.finger0 = GetTwoFinger(-1);
|
|
twoFinger.finger1 = GetTwoFinger(twoFinger.finger0);
|
|
|
|
twoFinger.startTimeAction = Time.realtimeSinceStartup;
|
|
twoFinger.currentGesture=GestureType.Acquisition;
|
|
|
|
fingers[twoFinger.finger0].startPosition = fingers[twoFinger.finger0].position;
|
|
fingers[twoFinger.finger1].startPosition = fingers[twoFinger.finger1].position;
|
|
|
|
fingers[twoFinger.finger0].oldPosition = fingers[twoFinger.finger0].position;
|
|
fingers[twoFinger.finger1].oldPosition = fingers[twoFinger.finger1].position;
|
|
|
|
|
|
twoFinger.oldFingerDistance = Mathf.Abs( Vector2.Distance(fingers[twoFinger.finger0].position, fingers[twoFinger.finger1].position));
|
|
twoFinger.startPosition = new Vector2((fingers[twoFinger.finger0].position.x+fingers[twoFinger.finger1].position.x)/2, (fingers[twoFinger.finger0].position.y+fingers[twoFinger.finger1].position.y)/2);
|
|
twoFinger.position = twoFinger.startPosition;
|
|
twoFinger.oldStartPosition = twoFinger.startPosition;
|
|
twoFinger.deltaPosition = Vector2.zero;
|
|
twoFinger.startDistance = twoFinger.oldFingerDistance;
|
|
|
|
// do we touch a pickable gameobject ?
|
|
if (autoSelect){
|
|
if (GetTwoFingerPickedObject()){
|
|
twoFinger.pickedObject = pickedObject.pickedObj;
|
|
twoFinger.pickedCamera = pickedObject.pickedCamera;
|
|
twoFinger.isGuiCamera = pickedObject.isGUI;
|
|
}
|
|
else{
|
|
twoFinger.ClearPickedObjectData();
|
|
}
|
|
}
|
|
|
|
// UnityGUI
|
|
if (allowUIDetection){
|
|
if (GetTwoFingerPickedUIElement()){
|
|
twoFinger.pickedUIElement = pickedObject.pickedObj;
|
|
twoFinger.isOverGui = true;
|
|
}
|
|
else{
|
|
twoFinger.ClearPickedUIData();
|
|
}
|
|
}
|
|
|
|
// we notify the touch
|
|
CreateGesture2Finger(EvtType.On_TouchStart2Fingers,twoFinger.startPosition,twoFinger.startPosition,twoFinger.deltaPosition,twoFinger.timeSinceStartAction, SwipeDirection.None,0,Vector2.zero,0,0,twoFinger.oldFingerDistance);
|
|
}
|
|
|
|
if (singleDoubleTap[99].inDoubleTap) singleDoubleTap[99].time += Time.deltaTime;
|
|
|
|
// Calculates the time since the beginning of the action.
|
|
twoFinger.timeSinceStartAction = Time.realtimeSinceStartup -twoFinger.startTimeAction;
|
|
|
|
// Position & deltaPosition
|
|
twoFinger.position = new Vector2((fingers[twoFinger.finger0].position.x+fingers[twoFinger.finger1].position.x)/2, (fingers[twoFinger.finger0].position.y+fingers[twoFinger.finger1].position.y)/2);
|
|
twoFinger.deltaPosition = twoFinger.position - twoFinger.oldStartPosition;
|
|
twoFinger.fingerDistance = Mathf.Abs(Vector2.Distance(fingers[twoFinger.finger0].position, fingers[twoFinger.finger1].position));
|
|
|
|
// Cancel
|
|
if (fingers[twoFinger.finger0].phase == TouchPhase.Canceled ||fingers[twoFinger.finger1].phase == TouchPhase.Canceled){
|
|
twoFinger.currentGesture = GestureType.Cancel;
|
|
}
|
|
|
|
// Let's go
|
|
if (fingers[twoFinger.finger0].phase != TouchPhase.Ended && fingers[twoFinger.finger1].phase != TouchPhase.Ended && twoFinger.currentGesture != GestureType.Cancel){
|
|
|
|
|
|
// Are we stationary ?
|
|
if (twoFinger.currentGesture == GestureType.Acquisition && twoFinger.timeSinceStartAction >= longTapTime && FingerInTolerance(fingers[twoFinger.finger0]) && FingerInTolerance(fingers[twoFinger.finger1])){
|
|
twoFinger.currentGesture = GestureType.LongTap;
|
|
// we notify the beginning of a longtouch
|
|
CreateGesture2Finger(EvtType.On_LongTapStart2Fingers,twoFinger.startPosition,twoFinger.position,twoFinger.deltaPosition,twoFinger.timeSinceStartAction, SwipeDirection.None,0,Vector2.zero,0,0,twoFinger.fingerDistance);
|
|
}
|
|
|
|
// Let's move us ?
|
|
if ( ((FingerInTolerance(fingers[twoFinger.finger0])==false || FingerInTolerance(fingers[twoFinger.finger1])==false) && gesturePriority == GesturePriority.Tap )
|
|
|| ((fingers[twoFinger.finger0].phase == TouchPhase.Moved || fingers[twoFinger.finger1].phase == TouchPhase.Moved) && gesturePriority == GesturePriority.Slips) ) {
|
|
move=true;
|
|
}
|
|
|
|
// we move
|
|
if (move && twoFinger.currentGesture != GestureType.Tap){
|
|
Vector2 currentDistance = fingers[twoFinger.finger0].position - fingers[twoFinger.finger1].position;
|
|
Vector2 previousDistance = fingers[twoFinger.finger0].oldPosition - fingers[twoFinger.finger1].oldPosition ;
|
|
float currentDelta = currentDistance.magnitude - previousDistance.magnitude;
|
|
|
|
|
|
#region drag & swipe
|
|
if (enable2FingersSwipe){
|
|
float dot = Vector2.Dot(fingers[twoFinger.finger0].deltaPosition.normalized, fingers[twoFinger.finger1].deltaPosition.normalized);
|
|
|
|
if (dot>0 ){
|
|
|
|
if (twoFinger.oldGesture == GestureType.LongTap){
|
|
CreateStateEnd2Fingers(twoFinger.currentGesture,twoFinger.startPosition,twoFinger.position,twoFinger.deltaPosition,twoFinger.timeSinceStartAction,false,twoFinger.fingerDistance);
|
|
twoFinger.startTimeAction = Time.realtimeSinceStartup;
|
|
}
|
|
|
|
if (twoFinger.pickedObject && !twoFinger.dragStart && !alwaysSendSwipe){
|
|
|
|
twoFinger.currentGesture = GestureType.Drag;
|
|
|
|
CreateGesture2Finger(EvtType.On_DragStart2Fingers,twoFinger.startPosition,twoFinger.position,twoFinger.deltaPosition,twoFinger.timeSinceStartAction, SwipeDirection.None,0,Vector2.zero,0,0,twoFinger.fingerDistance);
|
|
CreateGesture2Finger(EvtType.On_SwipeStart2Fingers,twoFinger.startPosition,twoFinger.position,twoFinger.deltaPosition,twoFinger.timeSinceStartAction, SwipeDirection.None,0,Vector2.zero,0,0,twoFinger.fingerDistance);
|
|
twoFinger.dragStart = true;
|
|
}
|
|
else if (!twoFinger.pickedObject && !twoFinger.swipeStart){
|
|
|
|
twoFinger.currentGesture = GestureType.Swipe;
|
|
|
|
CreateGesture2Finger(EvtType.On_SwipeStart2Fingers,twoFinger.startPosition,twoFinger.position,twoFinger.deltaPosition,twoFinger.timeSinceStartAction, SwipeDirection.None,0,Vector2.zero,0,0,twoFinger.fingerDistance);
|
|
twoFinger.swipeStart=true;
|
|
}
|
|
|
|
}
|
|
else{
|
|
if (dot<0){
|
|
twoFinger.dragStart=false;
|
|
twoFinger.swipeStart=false;
|
|
}
|
|
}
|
|
|
|
//
|
|
if (twoFinger.dragStart){
|
|
CreateGesture2Finger(EvtType.On_Drag2Fingers,twoFinger.startPosition,twoFinger.position,twoFinger.deltaPosition,twoFinger.timeSinceStartAction, GetSwipe(twoFinger.oldStartPosition,twoFinger.position),0,twoFinger.deltaPosition,0,0,twoFinger.fingerDistance);
|
|
CreateGesture2Finger(EvtType.On_Swipe2Fingers,twoFinger.startPosition,twoFinger.position,twoFinger.deltaPosition,twoFinger.timeSinceStartAction, GetSwipe(twoFinger.oldStartPosition,twoFinger.position),0,twoFinger.deltaPosition,0,0,twoFinger.fingerDistance);
|
|
}
|
|
|
|
if (twoFinger.swipeStart){
|
|
CreateGesture2Finger(EvtType.On_Swipe2Fingers,twoFinger.startPosition,twoFinger.position,twoFinger.deltaPosition,twoFinger.timeSinceStartAction, GetSwipe(twoFinger.oldStartPosition,twoFinger.position),0,twoFinger.deltaPosition,0,0,twoFinger.fingerDistance);
|
|
}
|
|
|
|
}
|
|
#endregion
|
|
|
|
DetectPinch(currentDelta);
|
|
DetecTwist( previousDistance, currentDistance,currentDelta);
|
|
}
|
|
else{
|
|
// Long tap update
|
|
if (twoFinger.currentGesture == GestureType.LongTap){
|
|
CreateGesture2Finger(EvtType.On_LongTap2Fingers,twoFinger.startPosition,twoFinger.position,twoFinger.deltaPosition,twoFinger.timeSinceStartAction, SwipeDirection.None,0,Vector2.zero,0,0,twoFinger.fingerDistance);
|
|
}
|
|
}
|
|
|
|
CreateGesture2Finger(EvtType.On_TouchDown2Fingers,twoFinger.startPosition,twoFinger.position,twoFinger.deltaPosition,twoFinger.timeSinceStartAction, GetSwipe(twoFinger.oldStartPosition,twoFinger.position),0,twoFinger.deltaPosition,0,0,twoFinger.fingerDistance);
|
|
|
|
fingers[twoFinger.finger0].oldPosition = fingers[twoFinger.finger0].position;
|
|
fingers[twoFinger.finger1].oldPosition = fingers[twoFinger.finger1].position;
|
|
|
|
twoFinger.oldFingerDistance = twoFinger.fingerDistance;
|
|
twoFinger.oldStartPosition = twoFinger.position;
|
|
twoFinger.oldGesture = twoFinger.currentGesture;
|
|
|
|
}
|
|
else{
|
|
|
|
if (twoFinger.currentGesture != GestureType.Acquisition && twoFinger.currentGesture!= GestureType.Tap){
|
|
CreateStateEnd2Fingers(twoFinger.currentGesture,twoFinger.startPosition,twoFinger.position,twoFinger.deltaPosition,twoFinger.timeSinceStartAction,true,twoFinger.fingerDistance);
|
|
twoFinger.currentGesture = GestureType.None;
|
|
twoFinger.pickedObject=null;
|
|
twoFinger.swipeStart = false;
|
|
twoFinger.dragStart = false;
|
|
|
|
}
|
|
else{
|
|
twoFinger.currentGesture = GestureType.Tap;
|
|
CreateStateEnd2Fingers(twoFinger.currentGesture,twoFinger.startPosition,twoFinger.position,twoFinger.deltaPosition,twoFinger.timeSinceStartAction,true,twoFinger.fingerDistance);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
private void DetectPinch(float currentDelta){
|
|
#region Pinch
|
|
if (enablePinch){
|
|
|
|
if ((Mathf.Abs(twoFinger.fingerDistance - twoFinger.startDistance)>= minPinchLength && twoFinger.currentGesture != GestureType.Pinch) || twoFinger.currentGesture== GestureType.Pinch ){
|
|
|
|
if (currentDelta !=0 && twoFinger.oldGesture == GestureType.LongTap){
|
|
CreateStateEnd2Fingers(twoFinger.currentGesture,twoFinger.startPosition,twoFinger.position,twoFinger.deltaPosition,twoFinger.timeSinceStartAction,false,twoFinger.fingerDistance);
|
|
twoFinger.startTimeAction = Time.realtimeSinceStartup;
|
|
}
|
|
|
|
twoFinger.currentGesture = GestureType.Pinch;
|
|
|
|
if (currentDelta>0){
|
|
CreateGesture2Finger(EvtType.On_PinchOut,twoFinger.startPosition,twoFinger.position,twoFinger.deltaPosition,twoFinger.timeSinceStartAction, GetSwipe(twoFinger.startPosition,twoFinger.position),0,Vector2.zero,0,Mathf.Abs(twoFinger.fingerDistance-twoFinger.oldFingerDistance),twoFinger.fingerDistance);
|
|
}
|
|
|
|
if (currentDelta<0){
|
|
CreateGesture2Finger(EvtType.On_PinchIn,twoFinger.startPosition,twoFinger.position,twoFinger.deltaPosition,twoFinger.timeSinceStartAction, GetSwipe(twoFinger.startPosition,twoFinger.position),0,Vector2.zero,0,Mathf.Abs(twoFinger.fingerDistance-twoFinger.oldFingerDistance),twoFinger.fingerDistance);
|
|
}
|
|
|
|
if (currentDelta<0 || currentDelta>0){
|
|
CreateGesture2Finger(EvtType.On_Pinch,twoFinger.startPosition,twoFinger.position,twoFinger.deltaPosition,twoFinger.timeSinceStartAction, GetSwipe(twoFinger.startPosition,twoFinger.position),0,Vector2.zero,0,currentDelta,twoFinger.fingerDistance);
|
|
}
|
|
|
|
}
|
|
|
|
twoFinger.lastPinch = currentDelta>0?currentDelta:twoFinger.lastPinch;
|
|
}
|
|
#endregion
|
|
}
|
|
|
|
private void DetecTwist(Vector2 previousDistance, Vector2 currentDistance, float currentDelta){
|
|
#region Twist
|
|
if (enableTwist){
|
|
|
|
float twistAngle = Vector2.Angle( previousDistance, currentDistance );
|
|
|
|
//Debug.Log( twistAngle);
|
|
if (previousDistance == currentDistance)
|
|
twistAngle =0;
|
|
|
|
if ( Mathf.Abs(twistAngle)>=minTwistAngle && (twoFinger.currentGesture != GestureType.Twist ) || twoFinger.currentGesture== GestureType.Twist ){
|
|
|
|
if ( twoFinger.oldGesture == GestureType.LongTap){
|
|
CreateStateEnd2Fingers(twoFinger.currentGesture,twoFinger.startPosition,twoFinger.position,twoFinger.deltaPosition,twoFinger.timeSinceStartAction,false,twoFinger.fingerDistance);
|
|
twoFinger.startTimeAction = Time.realtimeSinceStartup;
|
|
}
|
|
|
|
twoFinger.currentGesture = GestureType.Twist;
|
|
|
|
if (twistAngle!=0){
|
|
twistAngle *= Mathf.Sign( Vector3.Cross( previousDistance, currentDistance).z);
|
|
}
|
|
|
|
CreateGesture2Finger(EvtType.On_Twist,twoFinger.startPosition,twoFinger.position,twoFinger.deltaPosition,twoFinger.timeSinceStartAction, SwipeDirection.None,0,Vector2.zero,twistAngle,0,twoFinger.fingerDistance);
|
|
}
|
|
|
|
twoFinger.lastTwistAngle = twistAngle!=0?twistAngle:twoFinger.lastTwistAngle;
|
|
}
|
|
#endregion
|
|
}
|
|
|
|
|
|
private void CreateStateEnd2Fingers(GestureType gesture, Vector2 startPosition, Vector2 position, Vector2 deltaPosition,float time, bool realEnd,float fingerDistance,float twist=0, float pinch=0){
|
|
|
|
|
|
switch (gesture){
|
|
// Tap
|
|
case GestureType.Tap:
|
|
case GestureType.Acquisition:
|
|
|
|
if (doubleTapDetection == DoubleTapDetection.BySystem){
|
|
|
|
if (fingers[twoFinger.finger0].tapCount<2 && fingers[twoFinger.finger1].tapCount<2){
|
|
CreateGesture2Finger(EvtType.On_SimpleTap2Fingers,startPosition,position,deltaPosition,
|
|
time, SwipeDirection.None,0,Vector2.zero,0,0,fingerDistance);
|
|
}
|
|
else{
|
|
CreateGesture2Finger(EvtType.On_DoubleTap2Fingers,startPosition,position,deltaPosition,
|
|
time, SwipeDirection.None,0,Vector2.zero,0,0,fingerDistance);
|
|
}
|
|
twoFinger.currentGesture = GestureType.None;
|
|
twoFinger.pickedObject=null;
|
|
twoFinger.swipeStart = false;
|
|
twoFinger.dragStart = false;
|
|
singleDoubleTap[99].Stop();
|
|
StopCoroutine( "SingleOrDouble2Fingers");
|
|
|
|
}
|
|
else{
|
|
if (!singleDoubleTap[99].inWait){
|
|
StartCoroutine("SingleOrDouble2Fingers" );
|
|
}
|
|
else{
|
|
singleDoubleTap[99].count++;
|
|
}
|
|
}
|
|
break;
|
|
|
|
// Long tap
|
|
case GestureType.LongTap:
|
|
CreateGesture2Finger(EvtType.On_LongTapEnd2Fingers,startPosition,position,deltaPosition,
|
|
time, SwipeDirection.None,0,Vector2.zero,0,0,fingerDistance);
|
|
break;
|
|
|
|
// Pinch
|
|
case GestureType.Pinch:
|
|
CreateGesture2Finger(EvtType.On_PinchEnd,startPosition,position,deltaPosition,
|
|
time, SwipeDirection.None,0,Vector2.zero,0,twoFinger.lastPinch,fingerDistance);
|
|
break;
|
|
|
|
// twist
|
|
case GestureType.Twist:
|
|
CreateGesture2Finger(EvtType.On_TwistEnd,startPosition,position,deltaPosition,
|
|
time, SwipeDirection.None,0,Vector2.zero,twoFinger.lastTwistAngle,0,fingerDistance);
|
|
break;
|
|
}
|
|
|
|
if (realEnd){
|
|
// Drag
|
|
if ( twoFinger.dragStart){
|
|
CreateGesture2Finger(EvtType.On_DragEnd2Fingers,startPosition,position,deltaPosition,
|
|
time, GetSwipe( startPosition, position),( position-startPosition).magnitude,position-startPosition,0,0,fingerDistance);
|
|
};
|
|
|
|
// Swipe
|
|
if ( twoFinger.swipeStart){
|
|
CreateGesture2Finger(EvtType.On_SwipeEnd2Fingers,startPosition,position,deltaPosition,
|
|
time, GetSwipe( startPosition, position),( position-startPosition).magnitude,position-startPosition,0,0,fingerDistance);
|
|
}
|
|
|
|
CreateGesture2Finger(EvtType.On_TouchUp2Fingers,startPosition,position,deltaPosition,time, SwipeDirection.None,0,Vector2.zero,0,0,fingerDistance);
|
|
}
|
|
}
|
|
|
|
IEnumerator SingleOrDouble2Fingers(){
|
|
singleDoubleTap[99].inWait = true;
|
|
|
|
yield return new WaitForSeconds(doubleTapTime);
|
|
|
|
if (singleDoubleTap[99].count <2){
|
|
|
|
CreateGesture2Finger(EvtType.On_SimpleTap2Fingers,twoFinger.startPosition,twoFinger.position,twoFinger.deltaPosition,
|
|
twoFinger.timeSinceStartAction, SwipeDirection.None,0,Vector2.zero,0,0,twoFinger.fingerDistance);
|
|
|
|
}
|
|
else{
|
|
CreateGesture2Finger(EvtType.On_DoubleTap2Fingers,twoFinger.startPosition,twoFinger.position,twoFinger.deltaPosition,
|
|
twoFinger.timeSinceStartAction, SwipeDirection.None,0,Vector2.zero,0,0,twoFinger.fingerDistance);
|
|
}
|
|
|
|
twoFinger.currentGesture = GestureType.None;
|
|
twoFinger.pickedObject=null;
|
|
twoFinger.swipeStart = false;
|
|
twoFinger.dragStart = false;
|
|
singleDoubleTap[99].Stop();
|
|
StopCoroutine( "SingleOrDouble2Fingers");
|
|
}
|
|
|
|
private void CreateGesture2Finger(EvtType message,Vector2 startPosition,Vector2 position,Vector2 deltaPosition,
|
|
float actionTime, SwipeDirection swipe, float swipeLength,Vector2 swipeVector,float twist,float pinch, float twoDistance){
|
|
|
|
bool firingEvent = true;
|
|
Gesture gesture = new Gesture();
|
|
gesture.isOverGui = false;
|
|
|
|
// NGui
|
|
if (enabledNGuiMode && message == EvtType.On_TouchStart2Fingers){
|
|
gesture.isOverGui = gesture.isOverGui || ( IsTouchOverNGui(twoFinger.position) && IsTouchOverNGui(twoFinger.position));
|
|
}
|
|
|
|
gesture.touchCount=2;
|
|
gesture.fingerIndex=-1;
|
|
gesture.startPosition = startPosition;
|
|
gesture.position = position;
|
|
gesture.deltaPosition = deltaPosition;
|
|
|
|
gesture.actionTime = actionTime;
|
|
gesture.deltaTime=Time.deltaTime;
|
|
|
|
gesture.swipe = swipe;
|
|
gesture.swipeLength = swipeLength;
|
|
gesture.swipeVector = swipeVector;
|
|
|
|
gesture.deltaPinch = pinch;
|
|
gesture.twistAngle = twist;
|
|
gesture.twoFingerDistance = twoDistance;
|
|
|
|
gesture.pickedObject = twoFinger.pickedObject;
|
|
gesture.pickedCamera = twoFinger.pickedCamera;
|
|
gesture.isGuiCamera= twoFinger.isGuiCamera;
|
|
|
|
if (autoUpdatePickedObject){
|
|
if (message != EvtType.On_Drag && message != EvtType.On_DragEnd && message != EvtType.On_Twist && message != EvtType.On_TwistEnd && message != EvtType.On_Pinch && message != EvtType.On_PinchEnd
|
|
&& message != EvtType.On_PinchIn && message != EvtType.On_PinchOut){
|
|
|
|
if (GetTwoFingerPickedObject()){
|
|
gesture.pickedObject = pickedObject.pickedObj;
|
|
gesture.pickedCamera = pickedObject.pickedCamera;
|
|
gesture.isGuiCamera= pickedObject.isGUI;
|
|
}
|
|
else{
|
|
twoFinger.ClearPickedObjectData();
|
|
}
|
|
}
|
|
}
|
|
|
|
gesture.pickedUIElement = twoFinger.pickedUIElement;
|
|
gesture.isOverGui = twoFinger.isOverGui;
|
|
|
|
|
|
if (allowUIDetection && autoUpdatePickedUI){
|
|
if (message != EvtType.On_Drag && message != EvtType.On_DragEnd && message != EvtType.On_Twist && message != EvtType.On_TwistEnd && message != EvtType.On_Pinch && message != EvtType.On_PinchEnd
|
|
&& message != EvtType.On_PinchIn && message != EvtType.On_PinchOut){
|
|
if (message == EvtType.On_SimpleTap2Fingers)
|
|
|
|
if (GetTwoFingerPickedUIElement()){
|
|
gesture.pickedUIElement = pickedObject.pickedObj;
|
|
gesture.isOverGui = true;
|
|
}
|
|
else{
|
|
twoFinger.ClearPickedUIData();
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// Firing event ?
|
|
if ((enableUIMode || (enabledNGuiMode && allowUIDetection) ) ){
|
|
firingEvent = !gesture.isOverGui;
|
|
}
|
|
|
|
// Firing event
|
|
if ( firingEvent){
|
|
RaiseEvent(message, gesture);
|
|
}
|
|
else if (gesture.isOverGui){
|
|
if (message == EvtType.On_TouchUp2Fingers){
|
|
RaiseEvent(EvtType.On_UIElementTouchUp, gesture);
|
|
}
|
|
else{
|
|
RaiseEvent(EvtType.On_OverUIElement, gesture);
|
|
}
|
|
}
|
|
}
|
|
|
|
private int GetTwoFinger( int index){
|
|
|
|
int i=index+1;
|
|
bool find=false;
|
|
|
|
while (i<10 && !find){
|
|
if (fingers[i]!=null ){
|
|
if( i>=index){
|
|
find=true;
|
|
}
|
|
}
|
|
i++;
|
|
}
|
|
i--;
|
|
|
|
return i;
|
|
}
|
|
|
|
private bool GetTwoFingerPickedObject(){
|
|
|
|
bool returnValue = false;
|
|
|
|
if (twoFingerPickMethod == TwoFingerPickMethod.Finger){
|
|
if (GetPickedGameObject(fingers[twoFinger.finger0],false)){
|
|
GameObject tmp = pickedObject.pickedObj;
|
|
if (GetPickedGameObject(fingers[twoFinger.finger1],false)){
|
|
if (tmp == pickedObject.pickedObj){
|
|
returnValue = true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
else{
|
|
if (GetPickedGameObject(fingers[twoFinger.finger0],true)){
|
|
returnValue = true;
|
|
}
|
|
}
|
|
|
|
return returnValue;
|
|
}
|
|
|
|
private bool GetTwoFingerPickedUIElement(){
|
|
|
|
bool returnValue = false;
|
|
|
|
if (fingers[twoFinger.finger0] == null){
|
|
return false;
|
|
}
|
|
|
|
if (twoFingerPickMethod == TwoFingerPickMethod.Finger){
|
|
if (IsScreenPositionOverUI( fingers[twoFinger.finger0].position )){
|
|
GameObject tmp = GetFirstUIElementFromCache();
|
|
|
|
if (IsScreenPositionOverUI( fingers[twoFinger.finger1].position )){
|
|
GameObject tmp2 = GetFirstUIElementFromCache();
|
|
|
|
if (tmp2 == tmp || tmp2.transform.IsChildOf( tmp.transform) || tmp.transform.IsChildOf( tmp2.transform)){
|
|
pickedObject.pickedObj = tmp;
|
|
pickedObject.isGUI = true;
|
|
returnValue = true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else{
|
|
if (IsScreenPositionOverUI( twoFinger.position )){
|
|
pickedObject.pickedObj = GetFirstUIElementFromCache();
|
|
pickedObject.isGUI = true;
|
|
returnValue = true;
|
|
}
|
|
}
|
|
|
|
return returnValue;
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region General private methods
|
|
private void RaiseEvent(EvtType evnt, Gesture gesture){
|
|
|
|
gesture.type = evnt;
|
|
|
|
switch(evnt){
|
|
case EvtType.On_Cancel:
|
|
if (On_Cancel!=null)
|
|
On_Cancel( gesture);
|
|
break;
|
|
case EvtType.On_Cancel2Fingers:
|
|
if (On_Cancel2Fingers!=null)
|
|
On_Cancel2Fingers( gesture );
|
|
break;
|
|
case EvtType.On_TouchStart:
|
|
if (On_TouchStart!=null)
|
|
On_TouchStart( gesture);
|
|
break;
|
|
case EvtType.On_TouchDown:
|
|
if (On_TouchDown!=null)
|
|
On_TouchDown( gesture);
|
|
break;
|
|
case EvtType.On_TouchUp:
|
|
if (On_TouchUp!=null)
|
|
On_TouchUp( gesture );
|
|
break;
|
|
case EvtType.On_SimpleTap:
|
|
if (On_SimpleTap!=null)
|
|
On_SimpleTap( gesture);
|
|
break;
|
|
case EvtType.On_DoubleTap:
|
|
if (On_DoubleTap!=null)
|
|
On_DoubleTap(gesture);
|
|
break;
|
|
case EvtType.On_LongTapStart:
|
|
if (On_LongTapStart!=null)
|
|
On_LongTapStart(gesture);
|
|
break;
|
|
case EvtType.On_LongTap:
|
|
if (On_LongTap!=null)
|
|
On_LongTap(gesture);
|
|
break;
|
|
case EvtType.On_LongTapEnd:
|
|
if (On_LongTapEnd!=null)
|
|
On_LongTapEnd(gesture);
|
|
break;
|
|
case EvtType.On_DragStart:
|
|
if (On_DragStart!=null)
|
|
On_DragStart(gesture);
|
|
break;
|
|
case EvtType.On_Drag:
|
|
if (On_Drag!=null)
|
|
On_Drag(gesture);
|
|
break;
|
|
case EvtType.On_DragEnd:
|
|
if (On_DragEnd!=null)
|
|
On_DragEnd(gesture);
|
|
break;
|
|
case EvtType.On_SwipeStart:
|
|
if (On_SwipeStart!=null)
|
|
On_SwipeStart( gesture);
|
|
break;
|
|
case EvtType.On_Swipe:
|
|
if (On_Swipe!=null)
|
|
On_Swipe( gesture);
|
|
break;
|
|
case EvtType.On_SwipeEnd:
|
|
if (On_SwipeEnd!=null)
|
|
On_SwipeEnd(gesture);
|
|
break;
|
|
case EvtType.On_TouchStart2Fingers:
|
|
if (On_TouchStart2Fingers!=null)
|
|
On_TouchStart2Fingers( gesture);
|
|
break;
|
|
case EvtType.On_TouchDown2Fingers:
|
|
if (On_TouchDown2Fingers!=null)
|
|
On_TouchDown2Fingers(gesture);
|
|
break;
|
|
case EvtType.On_TouchUp2Fingers:
|
|
if (On_TouchUp2Fingers!=null)
|
|
On_TouchUp2Fingers(gesture);
|
|
break;
|
|
case EvtType.On_SimpleTap2Fingers:
|
|
if (On_SimpleTap2Fingers!=null)
|
|
On_SimpleTap2Fingers(gesture);
|
|
break;
|
|
case EvtType.On_DoubleTap2Fingers:
|
|
if (On_DoubleTap2Fingers!=null)
|
|
On_DoubleTap2Fingers(gesture);
|
|
break;
|
|
case EvtType.On_LongTapStart2Fingers:
|
|
if (On_LongTapStart2Fingers!=null)
|
|
On_LongTapStart2Fingers(gesture);
|
|
break;
|
|
case EvtType.On_LongTap2Fingers:
|
|
if (On_LongTap2Fingers!=null)
|
|
On_LongTap2Fingers(gesture);
|
|
break;
|
|
case EvtType.On_LongTapEnd2Fingers:
|
|
if (On_LongTapEnd2Fingers!=null)
|
|
On_LongTapEnd2Fingers(gesture);
|
|
break;
|
|
case EvtType.On_Twist:
|
|
if (On_Twist!=null)
|
|
On_Twist(gesture);
|
|
break;
|
|
case EvtType.On_TwistEnd:
|
|
if (On_TwistEnd!=null)
|
|
On_TwistEnd(gesture);
|
|
break;
|
|
case EvtType.On_Pinch:
|
|
if (On_Pinch!=null)
|
|
On_Pinch(gesture);
|
|
break;
|
|
case EvtType.On_PinchIn:
|
|
if (On_PinchIn!=null)
|
|
On_PinchIn(gesture);
|
|
break;
|
|
case EvtType.On_PinchOut:
|
|
if (On_PinchOut!=null)
|
|
On_PinchOut(gesture);
|
|
break;
|
|
case EvtType.On_PinchEnd:
|
|
if (On_PinchEnd!=null)
|
|
On_PinchEnd(gesture);
|
|
break;
|
|
case EvtType.On_DragStart2Fingers:
|
|
if (On_DragStart2Fingers!=null)
|
|
On_DragStart2Fingers(gesture);
|
|
break;
|
|
case EvtType.On_Drag2Fingers:
|
|
if (On_Drag2Fingers!=null)
|
|
On_Drag2Fingers(gesture);
|
|
break;
|
|
case EvtType.On_DragEnd2Fingers:
|
|
if (On_DragEnd2Fingers!=null)
|
|
On_DragEnd2Fingers(gesture);
|
|
break;
|
|
case EvtType.On_SwipeStart2Fingers:
|
|
if (On_SwipeStart2Fingers!=null)
|
|
On_SwipeStart2Fingers(gesture);
|
|
break;
|
|
case EvtType.On_Swipe2Fingers:
|
|
if (On_Swipe2Fingers!=null)
|
|
On_Swipe2Fingers(gesture);
|
|
break;
|
|
case EvtType.On_SwipeEnd2Fingers:
|
|
if (On_SwipeEnd2Fingers!=null)
|
|
On_SwipeEnd2Fingers(gesture);
|
|
break;
|
|
case EvtType.On_OverUIElement:
|
|
if (On_OverUIElement!=null){
|
|
On_OverUIElement(gesture);
|
|
}
|
|
break;
|
|
case EvtType.On_UIElementTouchUp:
|
|
if (On_UIElementTouchUp!=null){
|
|
On_UIElementTouchUp( gesture);
|
|
}
|
|
break;
|
|
}
|
|
|
|
// Direct Acces
|
|
int result = _currentGestures.FindIndex( delegate(Gesture obj) {
|
|
return obj.type == gesture.type && obj.fingerIndex == gesture.fingerIndex;
|
|
}
|
|
);
|
|
|
|
if (result>-1){
|
|
_currentGestures[result].touchCount = gesture.touchCount;
|
|
_currentGestures[result].position = gesture.position;
|
|
_currentGestures[result].actionTime = gesture.actionTime;
|
|
_currentGestures[result].pickedCamera = gesture.pickedCamera;
|
|
_currentGestures[result].pickedObject = gesture.pickedObject;
|
|
_currentGestures[result].pickedUIElement = gesture.pickedUIElement;
|
|
_currentGestures[result].isOverGui = gesture.isOverGui;
|
|
_currentGestures[result].isGuiCamera = gesture.isGuiCamera;
|
|
|
|
// Update delta from current
|
|
_currentGestures[result].deltaPinch += gesture.deltaPinch;
|
|
_currentGestures[result].deltaPosition += gesture.deltaPosition;
|
|
|
|
_currentGestures[result].deltaTime += gesture.deltaTime;
|
|
_currentGestures[result].twistAngle += gesture.twistAngle;
|
|
}
|
|
|
|
if (result==-1 ){
|
|
_currentGestures.Add( (Gesture)gesture.Clone());
|
|
if (_currentGestures.Count>0){
|
|
_currentGesture = _currentGestures[0];
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
|
|
private bool GetPickedGameObject(Finger finger, bool isTowFinger=false){
|
|
|
|
if (finger == null && !isTowFinger){
|
|
return false;
|
|
}
|
|
|
|
pickedObject.isGUI = false;
|
|
pickedObject.pickedObj = null;
|
|
pickedObject.pickedCamera = null;
|
|
|
|
if (touchCameras.Count>0){
|
|
for (int i=0;i<touchCameras.Count;i++){
|
|
if (touchCameras[i].camera!=null && touchCameras[i].camera.enabled){
|
|
|
|
Vector2 pos=Vector2.zero;
|
|
if (!isTowFinger){
|
|
pos = finger.position;
|
|
}
|
|
else{
|
|
pos = twoFinger.position;
|
|
}
|
|
|
|
|
|
if (GetGameObjectAt( pos, touchCameras[i].camera,touchCameras[i].guiCamera)){
|
|
return true;
|
|
}
|
|
/*
|
|
Ray ray = touchCameras[i].camera.ScreenPointToRay( pos );
|
|
RaycastHit hit;
|
|
|
|
if (enable2D){
|
|
|
|
LayerMask mask2d = pickableLayers2D;
|
|
RaycastHit2D[] hit2D = new RaycastHit2D[1];
|
|
if (Physics2D.GetRayIntersectionNonAlloc( ray,hit2D,float.PositiveInfinity,mask2d)>0){
|
|
pickedObject.pickedCamera = touchCameras[i].camera;
|
|
pickedObject.isGUI = touchCameras[i].guiCamera;
|
|
pickedObject.pickedObj = hit2D[0].collider.gameObject;
|
|
return true;
|
|
}
|
|
}
|
|
|
|
LayerMask mask = pickableLayers3D;
|
|
|
|
if( Physics.Raycast( ray, out hit,float.MaxValue,mask ) ){
|
|
pickedObject.pickedCamera = touchCameras[i].camera;
|
|
pickedObject.isGUI = touchCameras[i].guiCamera;
|
|
pickedObject.pickedObj = hit.collider.gameObject;
|
|
return true;
|
|
}*/
|
|
}
|
|
}
|
|
}
|
|
else{
|
|
Debug.LogWarning("No camera is assigned to EasyTouch");
|
|
}
|
|
return false;
|
|
}
|
|
|
|
private bool GetGameObjectAt(Vector2 position, Camera cam, bool isGuiCam){
|
|
|
|
Ray ray = cam.ScreenPointToRay( position );
|
|
RaycastHit hit;
|
|
|
|
if (enable2D){
|
|
|
|
LayerMask mask2d = pickableLayers2D;
|
|
RaycastHit2D[] hit2D = new RaycastHit2D[1];
|
|
if (Physics2D.GetRayIntersectionNonAlloc( ray,hit2D,float.PositiveInfinity,mask2d)>0){
|
|
pickedObject.pickedCamera = cam;
|
|
pickedObject.isGUI = isGuiCam;
|
|
pickedObject.pickedObj = hit2D[0].collider.gameObject;
|
|
return true;
|
|
}
|
|
}
|
|
|
|
LayerMask mask = pickableLayers3D;
|
|
|
|
if( Physics.Raycast( ray, out hit,float.MaxValue,mask ) ){
|
|
pickedObject.pickedCamera = cam;
|
|
pickedObject.isGUI =isGuiCam;
|
|
pickedObject.pickedObj = hit.collider.gameObject;
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
private SwipeDirection GetSwipe(Vector2 start, Vector2 end){
|
|
|
|
Vector2 linear;
|
|
linear = (end - start).normalized;
|
|
|
|
if ( Vector2.Dot( linear, Vector2.up) >= swipeTolerance)
|
|
return SwipeDirection.Up;
|
|
|
|
if ( Vector2.Dot( linear, -Vector2.up) >= swipeTolerance)
|
|
return SwipeDirection.Down;
|
|
|
|
if ( Vector2.Dot( linear, Vector2.right) >= swipeTolerance)
|
|
return SwipeDirection.Right;
|
|
|
|
if ( Vector2.Dot( linear, -Vector2.right) >= swipeTolerance)
|
|
return SwipeDirection.Left;
|
|
|
|
if ( Vector2.Dot( linear, new Vector2(0.5f,0.5f).normalized) >= swipeTolerance)
|
|
return SwipeDirection.UpRight;
|
|
|
|
if ( Vector2.Dot( linear, new Vector2(0.5f,-0.5f).normalized) >= swipeTolerance)
|
|
return SwipeDirection.DownRight;
|
|
|
|
if ( Vector2.Dot( linear, new Vector2(-0.5f,0.5f).normalized) >= swipeTolerance)
|
|
return SwipeDirection.UpLeft;
|
|
|
|
if ( Vector2.Dot( linear, new Vector2(-0.5f,-0.5f).normalized) >= swipeTolerance)
|
|
return SwipeDirection.DownLeft;
|
|
|
|
return SwipeDirection.Other;
|
|
}
|
|
|
|
private bool FingerInTolerance(Finger finger ){
|
|
|
|
if ((finger.position-finger.startPosition).sqrMagnitude <= (StationaryTolerance*StationaryTolerance)){
|
|
return true;
|
|
}
|
|
else{
|
|
return false;
|
|
}
|
|
}
|
|
|
|
private bool IsTouchOverNGui(Vector2 position, bool isTwoFingers=false){
|
|
|
|
bool returnValue = false;
|
|
|
|
if (enabledNGuiMode){
|
|
|
|
LayerMask mask= nGUILayers;
|
|
RaycastHit hit;
|
|
|
|
int i=0;
|
|
while (!returnValue && i<nGUICameras.Count){
|
|
Vector2 pos = Vector2.zero;
|
|
if (!isTwoFingers){
|
|
pos = position;//fingers[touchIndex].position;
|
|
}
|
|
else{
|
|
pos = twoFinger.position;
|
|
}
|
|
Ray ray = nGUICameras[i].ScreenPointToRay( pos );
|
|
|
|
returnValue = Physics.Raycast( ray, out hit,float.MaxValue,mask );
|
|
i++;
|
|
}
|
|
|
|
}
|
|
|
|
return returnValue;
|
|
|
|
}
|
|
|
|
private Finger GetFinger(int finderId){
|
|
int t=0;
|
|
|
|
Finger fing=null;
|
|
|
|
while (t < 10 && fing==null){
|
|
if (fingers[t] != null ){
|
|
if ( fingers[t].fingerIndex == finderId){
|
|
fing = fingers[t];
|
|
}
|
|
}
|
|
t++;
|
|
}
|
|
|
|
return fing;
|
|
}
|
|
#endregion
|
|
|
|
#region Unity UI
|
|
private bool IsScreenPositionOverUI( Vector2 position){
|
|
|
|
uiEventSystem = EventSystem.current;
|
|
if (uiEventSystem != null){
|
|
|
|
uiPointerEventData = new PointerEventData( uiEventSystem);
|
|
uiPointerEventData.position = position;
|
|
|
|
uiEventSystem.RaycastAll( uiPointerEventData, uiRaycastResultCache);
|
|
if (uiRaycastResultCache.Count>0){
|
|
return true;
|
|
}
|
|
else{
|
|
return false;
|
|
}
|
|
}
|
|
else{
|
|
return false;
|
|
}
|
|
}
|
|
|
|
private GameObject GetFirstUIElementFromCache(){
|
|
|
|
if (uiRaycastResultCache.Count>0){
|
|
return uiRaycastResultCache[0].gameObject;
|
|
}
|
|
else{
|
|
return null;
|
|
}
|
|
}
|
|
|
|
private GameObject GetFirstUIElement( Vector2 position){
|
|
|
|
if (IsScreenPositionOverUI( position)){
|
|
return GetFirstUIElementFromCache();
|
|
}
|
|
else{
|
|
return null;
|
|
}
|
|
}
|
|
#endregion
|
|
|
|
#region Static Method
|
|
// Unity UI compatibility
|
|
public static bool IsFingerOverUIElement( int fingerIndex){
|
|
if (EasyTouch.instance!=null){
|
|
Finger finger = EasyTouch.instance.GetFinger(fingerIndex);
|
|
if (finger != null){
|
|
return EasyTouch.instance.IsScreenPositionOverUI( finger.position);
|
|
}
|
|
else{
|
|
return false;
|
|
}
|
|
}
|
|
else{
|
|
return false;
|
|
}
|
|
}
|
|
|
|
public static GameObject GetCurrentPickedUIElement( int fingerIndex,bool isTwoFinger){
|
|
if (EasyTouch.instance!=null){
|
|
Finger finger = EasyTouch.instance.GetFinger(fingerIndex);
|
|
if (finger != null || isTwoFinger){
|
|
Vector2 pos = Vector2.zero;
|
|
if (!isTwoFinger){
|
|
pos = finger.position;
|
|
}
|
|
else{
|
|
pos = EasyTouch.instance.twoFinger.position;
|
|
}
|
|
return EasyTouch.instance.GetFirstUIElement( pos);
|
|
}
|
|
else{
|
|
return null;
|
|
}
|
|
}
|
|
else{
|
|
return null;
|
|
}
|
|
}
|
|
|
|
public static GameObject GetCurrentPickedObject(int fingerIndex, bool isTwoFinger){
|
|
|
|
if (EasyTouch.instance!=null){
|
|
Finger finger = EasyTouch.instance.GetFinger(fingerIndex);
|
|
|
|
if ((finger!=null || isTwoFinger) && EasyTouch.instance.GetPickedGameObject(finger,isTwoFinger)){
|
|
return EasyTouch.instance.pickedObject.pickedObj;
|
|
}
|
|
else{
|
|
return null;
|
|
}
|
|
}
|
|
else{
|
|
return null;
|
|
}
|
|
|
|
}
|
|
|
|
public static GameObject GetGameObjectAt( Vector2 position, bool isTwoFinger = false){
|
|
|
|
|
|
if (EasyTouch.instance!=null){
|
|
|
|
if (isTwoFinger) position = EasyTouch.instance.twoFinger.position;
|
|
if (EasyTouch.instance.touchCameras.Count>0){
|
|
for (int i=0;i<EasyTouch.instance.touchCameras.Count;i++){
|
|
if (EasyTouch.instance.touchCameras[i].camera!=null && EasyTouch.instance.touchCameras[i].camera.enabled){
|
|
if( EasyTouch.instance.GetGameObjectAt( position,EasyTouch.instance.touchCameras[i].camera,EasyTouch.instance.touchCameras[i].guiCamera)){
|
|
return EasyTouch.instance.pickedObject.pickedObj;
|
|
}
|
|
else{
|
|
return null;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
|
|
public static int GetTouchCount(){
|
|
if (EasyTouch.instance){
|
|
return EasyTouch.instance.input.TouchCount();
|
|
}
|
|
else{
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
public static void ResetTouch(int fingerIndex){
|
|
if (EasyTouch.instance)
|
|
EasyTouch.instance.GetFinger(fingerIndex).gesture=GestureType.None;
|
|
}
|
|
|
|
|
|
public static void SetEnabled( bool enable){
|
|
EasyTouch.instance.enable = enable;
|
|
if (enable){
|
|
EasyTouch.instance.ResetTouches();
|
|
}
|
|
}
|
|
public static bool GetEnabled(){
|
|
if (EasyTouch.instance)
|
|
return EasyTouch.instance.enable;
|
|
else
|
|
return false;
|
|
}
|
|
|
|
public static void SetEnableUIDetection( bool enable){
|
|
if (EasyTouch.instance != null){
|
|
EasyTouch.instance.allowUIDetection = enable;
|
|
}
|
|
}
|
|
public static bool GetEnableUIDetection(){
|
|
if (EasyTouch.instance){
|
|
return EasyTouch.instance.allowUIDetection;
|
|
}
|
|
else{
|
|
return false;
|
|
}
|
|
}
|
|
|
|
public static void SetUICompatibily(bool value){
|
|
if (EasyTouch.instance != null){
|
|
EasyTouch.instance.enableUIMode = value;
|
|
}
|
|
}
|
|
public static bool GetUIComptability(){
|
|
if (EasyTouch.instance != null){
|
|
return EasyTouch.instance.enableUIMode;
|
|
}
|
|
else{
|
|
return false;
|
|
}
|
|
}
|
|
|
|
public static void SetAutoUpdateUI(bool value){
|
|
if (EasyTouch.instance)
|
|
EasyTouch.instance.autoUpdatePickedUI = value;
|
|
}
|
|
public static bool GetAutoUpdateUI(){
|
|
if (EasyTouch.instance)
|
|
return EasyTouch.instance.autoUpdatePickedUI;
|
|
else
|
|
return false;
|
|
}
|
|
|
|
public static void SetNGUICompatibility(bool value){
|
|
if (EasyTouch.instance)
|
|
EasyTouch.instance.enabledNGuiMode = value;
|
|
}
|
|
public static bool GetNGUICompatibility(){
|
|
if (EasyTouch.instance)
|
|
return EasyTouch.instance.enabledNGuiMode;
|
|
else
|
|
return false;
|
|
}
|
|
|
|
|
|
public static void SetEnableAutoSelect( bool value){
|
|
if (EasyTouch.instance)
|
|
EasyTouch.instance.autoSelect = value;
|
|
}
|
|
public static bool GetEnableAutoSelect(){
|
|
if (EasyTouch.instance)
|
|
return EasyTouch.instance.autoSelect;
|
|
else
|
|
return false;
|
|
}
|
|
|
|
public static void SetAutoUpdatePickedObject(bool value){
|
|
if (EasyTouch.instance)
|
|
EasyTouch.instance.autoUpdatePickedObject = value;
|
|
}
|
|
public static bool GetAutoUpdatePickedObject(){
|
|
if (EasyTouch.instance)
|
|
return EasyTouch.instance.autoUpdatePickedObject;
|
|
else
|
|
return false;
|
|
}
|
|
|
|
public static void Set3DPickableLayer(LayerMask mask){
|
|
if (EasyTouch.instance)
|
|
EasyTouch.instance.pickableLayers3D = mask;
|
|
}
|
|
public static LayerMask Get3DPickableLayer(){
|
|
if (EasyTouch.instance)
|
|
return EasyTouch.instance.pickableLayers3D;
|
|
else
|
|
return LayerMask.GetMask("Default");
|
|
}
|
|
|
|
public static void AddCamera(Camera cam,bool guiCam=false){
|
|
if (EasyTouch.instance)
|
|
EasyTouch.instance.touchCameras.Add(new ECamera(cam,guiCam));
|
|
}
|
|
public static void RemoveCamera( Camera cam){
|
|
if (EasyTouch.instance){
|
|
|
|
int result = EasyTouch.instance.touchCameras.FindIndex(
|
|
delegate( ECamera c){
|
|
return c.camera == cam;
|
|
}
|
|
);
|
|
|
|
if (result>-1){
|
|
EasyTouch.instance.touchCameras[result]=null;
|
|
EasyTouch.instance.touchCameras.RemoveAt( result);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
public static Camera GetCamera(int index=0){
|
|
if (EasyTouch.instance){
|
|
if (index< EasyTouch.instance.touchCameras.Count){
|
|
return EasyTouch.instance.touchCameras[index].camera;
|
|
}
|
|
else{
|
|
return null;
|
|
}
|
|
}
|
|
else{
|
|
return null;
|
|
}
|
|
}
|
|
|
|
public static void SetEnable2DCollider(bool value){
|
|
if (EasyTouch.instance)
|
|
EasyTouch.instance.enable2D = value;
|
|
}
|
|
public static bool GetEnable2DCollider(){
|
|
if (EasyTouch.instance)
|
|
return EasyTouch.instance.enable2D;
|
|
else
|
|
return false;
|
|
}
|
|
|
|
public static void Set2DPickableLayer(LayerMask mask){
|
|
if (EasyTouch.instance)
|
|
EasyTouch.instance.pickableLayers2D = mask;
|
|
}
|
|
public static LayerMask Get2DPickableLayer(){
|
|
if (EasyTouch.instance)
|
|
return EasyTouch.instance.pickableLayers2D;
|
|
else
|
|
return LayerMask.GetMask("Default");
|
|
}
|
|
|
|
|
|
public static void SetGesturePriority( GesturePriority value){
|
|
if (EasyTouch.instance)
|
|
EasyTouch.instance.gesturePriority = value;
|
|
}
|
|
public static GesturePriority GetGesturePriority(){
|
|
if (EasyTouch.instance)
|
|
return EasyTouch.instance.gesturePriority;
|
|
else
|
|
return GesturePriority.Tap;
|
|
}
|
|
|
|
public static void SetStationaryTolerance(float tolerance){
|
|
if (EasyTouch.instance)
|
|
EasyTouch.instance.StationaryTolerance = tolerance;
|
|
}
|
|
public static float GetStationaryTolerance(){
|
|
if (EasyTouch.instance)
|
|
return EasyTouch.instance.StationaryTolerance;
|
|
else
|
|
return -1;
|
|
}
|
|
|
|
public static void SetLongTapTime(float time){
|
|
if (EasyTouch.instance)
|
|
EasyTouch.instance.longTapTime = time;
|
|
}
|
|
public static float GetlongTapTime(){
|
|
if (EasyTouch.instance)
|
|
return EasyTouch.instance.longTapTime;
|
|
else
|
|
return -1;
|
|
}
|
|
|
|
public static void SetDoubleTapTime(float time){
|
|
if (EasyTouch.instance)
|
|
EasyTouch.instance.doubleTapTime = time;
|
|
}
|
|
public static float GetDoubleTapTime(){
|
|
if (EasyTouch.instance)
|
|
return EasyTouch.instance.doubleTapTime;
|
|
else
|
|
return -1;
|
|
}
|
|
|
|
public static void SetDoubleTapMethod(DoubleTapDetection detection){
|
|
if (EasyTouch.instance)
|
|
EasyTouch.instance.doubleTapDetection = detection;
|
|
}
|
|
public static EasyTouch.DoubleTapDetection GetDoubleTapMethod(){
|
|
if (EasyTouch.instance)
|
|
return EasyTouch.instance.doubleTapDetection;
|
|
else
|
|
return EasyTouch.DoubleTapDetection.BySystem;
|
|
}
|
|
|
|
public static void SetSwipeTolerance( float tolerance){
|
|
if (EasyTouch.instance)
|
|
EasyTouch.instance.swipeTolerance = tolerance;
|
|
}
|
|
public static float GetSwipeTolerance(){
|
|
if (EasyTouch.instance)
|
|
return EasyTouch.instance.swipeTolerance;
|
|
else
|
|
return -1;
|
|
}
|
|
|
|
|
|
public static void SetEnable2FingersGesture( bool enable){
|
|
if (EasyTouch.instance)
|
|
EasyTouch.instance.enable2FingersGesture = enable;
|
|
}
|
|
public static bool GetEnable2FingersGesture(){
|
|
if (EasyTouch.instance)
|
|
return EasyTouch.instance.enable2FingersGesture;
|
|
else
|
|
return false;
|
|
}
|
|
|
|
public static void SetTwoFingerPickMethod( EasyTouch.TwoFingerPickMethod pickMethod){
|
|
if (EasyTouch.instance)
|
|
EasyTouch.instance.twoFingerPickMethod = pickMethod;
|
|
}
|
|
public static EasyTouch.TwoFingerPickMethod GetTwoFingerPickMethod(){
|
|
if (EasyTouch.instance)
|
|
return EasyTouch.instance.twoFingerPickMethod;
|
|
else
|
|
return EasyTouch.TwoFingerPickMethod.Finger;
|
|
}
|
|
|
|
public static void SetEnablePinch( bool enable){
|
|
if (EasyTouch.instance)
|
|
EasyTouch.instance.enablePinch = enable;
|
|
}
|
|
public static bool GetEnablePinch(){
|
|
if (EasyTouch.instance)
|
|
return EasyTouch.instance.enablePinch;
|
|
else
|
|
return false;
|
|
}
|
|
|
|
public static void SetMinPinchLength(float length){
|
|
if (EasyTouch.instance)
|
|
EasyTouch.instance.minPinchLength=length;
|
|
}
|
|
public static float GetMinPinchLength(){
|
|
if (EasyTouch.instance)
|
|
return EasyTouch.instance.minPinchLength;
|
|
else
|
|
return -1;
|
|
}
|
|
|
|
public static void SetEnableTwist( bool enable){
|
|
if (EasyTouch.instance)
|
|
EasyTouch.instance.enableTwist = enable;
|
|
}
|
|
public static bool GetEnableTwist(){
|
|
if (EasyTouch.instance)
|
|
return EasyTouch.instance.enableTwist;
|
|
else
|
|
return false;
|
|
}
|
|
|
|
public static void SetMinTwistAngle(float angle){
|
|
if (EasyTouch.instance)
|
|
EasyTouch.instance.minTwistAngle = angle;
|
|
}
|
|
public static float GetMinTwistAngle(){
|
|
if (EasyTouch.instance)
|
|
return EasyTouch.instance.minTwistAngle;
|
|
else
|
|
return -1;
|
|
}
|
|
|
|
public static bool GetSecondeFingerSimulation(){
|
|
|
|
if (EasyTouch.instance != null){
|
|
return EasyTouch.instance.enableSimulation;
|
|
}
|
|
else{
|
|
return false;
|
|
}
|
|
}
|
|
public static void SetSecondFingerSimulation(bool value){
|
|
if (EasyTouch.instance != null){
|
|
EasyTouch.instance.enableSimulation = value;
|
|
}
|
|
}
|
|
#endregion
|
|
|
|
}
|
|
} |