243 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			C#
		
	
	
	
			
		
		
	
	
			243 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			C#
		
	
	
	
| /***********************************************
 | |
| 				EasyTouch V
 | |
| 	Copyright © 2014-2015 The Hedgehog Team
 | |
|     http://www.thehedgehogteam.com/Forum/
 | |
| 		
 | |
| 	  The.Hedgehog.Team@gmail.com
 | |
| 		
 | |
| **********************************************/
 | |
| using UnityEngine;
 | |
| using System.Collections;
 | |
| using UnityEngine.Events;
 | |
| using UnityEngine.EventSystems;
 | |
| using HedgehogTeam.EasyTouch;
 | |
| 
 | |
| namespace HedgehogTeam.EasyTouch{
 | |
| [AddComponentMenu("EasyTouch/Quick Drag")]
 | |
| public class QuickDrag: QuickBase {
 | |
| 
 | |
| 	#region Events
 | |
| 	[System.Serializable] public class OnDragStart : UnityEvent<Gesture>{}
 | |
| 	[System.Serializable] public class OnDrag : UnityEvent<Gesture>{}
 | |
| 	[System.Serializable] public class OnDragEnd : UnityEvent<Gesture>{}
 | |
| 	
 | |
| 	[SerializeField] 
 | |
| 	public OnDragStart onDragStart;
 | |
| 	[SerializeField] 
 | |
| 	public OnDrag onDrag;
 | |
| 	[SerializeField] 
 | |
| 	public OnDragEnd onDragEnd;
 | |
| 	#endregion
 | |
| 
 | |
| 	#region Members
 | |
| 	public bool isStopOncollisionEnter = false;
 | |
| 
 | |
| 	private Vector3 deltaPosition;
 | |
| 	private bool isOnDrag = false;
 | |
| 	private Gesture lastGesture;
 | |
| 	#endregion
 | |
| 	
 | |
| 	#region Monobehaviour CallBack
 | |
| 	public QuickDrag(){
 | |
| 		quickActionName = "QuickDrag"+ GetInstanceID().ToString();
 | |
| 		axesAction = AffectedAxesAction.XY;
 | |
| 	}
 | |
| 
 | |
| 	public override void OnEnable(){
 | |
| 		base.OnEnable();
 | |
| 		EasyTouch.On_TouchStart += On_TouchStart;
 | |
| 		EasyTouch.On_TouchDown += On_TouchDown;
 | |
| 		EasyTouch.On_TouchUp += On_TouchUp;
 | |
| 		EasyTouch.On_Drag += On_Drag;
 | |
| 		EasyTouch.On_DragStart += On_DragStart;
 | |
| 		EasyTouch.On_DragEnd += On_DragEnd;
 | |
| 	}
 | |
| 			
 | |
| 	public override void OnDisable(){
 | |
| 		base.OnDisable();
 | |
| 		UnsubscribeEvent();
 | |
| 	}
 | |
| 	
 | |
| 	void OnDestroy(){
 | |
| 		UnsubscribeEvent();
 | |
| 	}
 | |
| 	
 | |
| 	void UnsubscribeEvent(){
 | |
| 		EasyTouch.On_TouchStart -= On_TouchStart;
 | |
| 		EasyTouch.On_TouchDown -= On_TouchDown;
 | |
| 		EasyTouch.On_TouchUp -= On_TouchUp;
 | |
| 		EasyTouch.On_Drag -= On_Drag;
 | |
| 		EasyTouch.On_DragStart -= On_DragStart;
 | |
| 		EasyTouch.On_DragEnd -= On_DragEnd;
 | |
| 	}
 | |
| 
 | |
| 	void OnCollisionEnter(){
 | |
| 		if (isStopOncollisionEnter && isOnDrag){
 | |
| 			StopDrag();
 | |
| 		}
 | |
| 	}
 | |
| 	#endregion
 | |
| 	
 | |
| 	#region EasyTouch Event
 | |
| 	void On_TouchStart (Gesture gesture){
 | |
| 	
 | |
| 		if ( realType == GameObjectType.UI){
 | |
| 			if (gesture.isOverGui ){
 | |
| 				if ((gesture.pickedUIElement == gameObject || gesture.pickedUIElement.transform.IsChildOf( transform)) && fingerIndex==-1){
 | |
| 
 | |
| 					fingerIndex = gesture.fingerIndex;
 | |
| 					transform.SetAsLastSibling();
 | |
| 					onDragStart.Invoke(gesture);
 | |
| 
 | |
| 					isOnDrag = true;
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	void On_TouchDown (Gesture gesture){
 | |
| 
 | |
| 		if (isOnDrag && fingerIndex == gesture.fingerIndex && realType == GameObjectType.UI){
 | |
| 			if (gesture.isOverGui ){
 | |
| 				if ((gesture.pickedUIElement == gameObject || gesture.pickedUIElement.transform.IsChildOf( transform)) ){
 | |
| 					transform.position += (Vector3)gesture.deltaPosition;
 | |
| 
 | |
| 					if (gesture.deltaPosition != Vector2.zero){
 | |
| 						onDrag.Invoke(gesture);
 | |
| 					}
 | |
| 					lastGesture = gesture;
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	void On_TouchUp (Gesture gesture){
 | |
| 
 | |
| 		if (fingerIndex == gesture.fingerIndex && realType == GameObjectType.UI){
 | |
| 			lastGesture = gesture;
 | |
| 			StopDrag();
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 
 | |
| 	// At the drag beginning 
 | |
| 	void On_DragStart( Gesture gesture){
 | |
| 		
 | |
| 		if (realType != GameObjectType.UI){
 | |
| 
 | |
| 			if ((!enablePickOverUI && gesture.pickedUIElement == null) || enablePickOverUI){
 | |
| 				if (gesture.pickedObject == gameObject && !isOnDrag){
 | |
| 
 | |
| 					isOnDrag = true;
 | |
| 
 | |
| 					fingerIndex = gesture.fingerIndex;
 | |
| 
 | |
| 					// the world coordinate from touch
 | |
| 					Vector3 position = gesture.GetTouchToWorldPoint(gesture.pickedObject.transform.position);
 | |
| 					deltaPosition = position - transform.position;
 | |
| 
 | |
| 					// 
 | |
| 					if (resetPhysic){
 | |
| 						if (cachedRigidBody){
 | |
| 							cachedRigidBody.isKinematic = true;
 | |
| 						}
 | |
| 
 | |
| 						if (cachedRigidBody2D){
 | |
| 							cachedRigidBody2D.isKinematic = true;
 | |
| 						}
 | |
| 					}
 | |
| 
 | |
| 					onDragStart.Invoke(gesture);
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 	}
 | |
| 	
 | |
| 	// During the drag
 | |
| 	void On_Drag(Gesture gesture){
 | |
| 
 | |
| 		if (fingerIndex == gesture.fingerIndex){
 | |
| 			if (realType == GameObjectType.Obj_2D || realType == GameObjectType.Obj_3D){
 | |
| 
 | |
| 				// Verification that the action on the object
 | |
| 				if (gesture.pickedObject == gameObject && fingerIndex == gesture.fingerIndex){
 | |
| 					
 | |
| 					// the world coordinate from touch
 | |
| 					Vector3 position = gesture.GetTouchToWorldPoint(gesture.pickedObject.transform.position)-deltaPosition;
 | |
| 					transform.position = GetPositionAxes( position);
 | |
| 
 | |
| 					if (gesture.deltaPosition != Vector2.zero){
 | |
| 						onDrag.Invoke(gesture);
 | |
| 
 | |
| 					}
 | |
| 					lastGesture = gesture;
 | |
| 				}
 | |
| 
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	// End of drag
 | |
| 	void On_DragEnd(Gesture gesture){
 | |
| 
 | |
| 		if (fingerIndex == gesture.fingerIndex){
 | |
| 			lastGesture = gesture;
 | |
| 			StopDrag();
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	#endregion
 | |
| 
 | |
| 	#region Private Method
 | |
| 	private Vector3 GetPositionAxes(Vector3 position){
 | |
| 		
 | |
| 		Vector3 axes = position;
 | |
| 		
 | |
| 		switch (axesAction){
 | |
| 		case AffectedAxesAction.X:
 | |
| 			axes = new Vector3(position.x,transform.position.y,transform.position.z);
 | |
| 			break;
 | |
| 		case AffectedAxesAction.Y:
 | |
| 			axes = new Vector3(transform.position.x,position.y,transform.position.z);
 | |
| 			break;
 | |
| 		case AffectedAxesAction.Z:
 | |
| 			axes = new Vector3(transform.position.x,transform.position.y,position.z);
 | |
| 			break;
 | |
| 		case AffectedAxesAction.XY:
 | |
| 			axes = new Vector3(position.x,position.y,transform.position.z);
 | |
| 			break;
 | |
| 		case AffectedAxesAction.XZ:
 | |
| 			axes = new Vector3(position.x,transform.position.y,position.z);
 | |
| 			break;
 | |
| 		case AffectedAxesAction.YZ:
 | |
| 			axes = new Vector3(transform.position.x,position.y,position.z);
 | |
| 			break;
 | |
| 		}
 | |
| 		
 | |
| 		return axes;
 | |
| 	
 | |
| 	}
 | |
| 	#endregion
 | |
| 
 | |
| 	#region Public Method
 | |
| 	public void StopDrag(){
 | |
| 
 | |
| 		fingerIndex = -1;
 | |
| 
 | |
| 		if (resetPhysic){
 | |
| 			if (cachedRigidBody){
 | |
| 				cachedRigidBody.isKinematic = isKinematic;
 | |
| 			}
 | |
| 			
 | |
| 			if (cachedRigidBody2D){
 | |
| 				cachedRigidBody2D.isKinematic = isKinematic2D;
 | |
| 			}
 | |
| 		}
 | |
| 		isOnDrag = false;
 | |
| 
 | |
| 		onDragEnd.Invoke(lastGesture);
 | |
| 	}
 | |
| 	#endregion
 | |
| }
 | |
| } |