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
|
|
}
|
|
} |