EasyTouch学习

 

enum...EasyTouch插件封装了很多手势,可以实现拖拽,滑动,虚拟摇杆,双击,快击.....等等等...

以前自己实现 滑动,等双击,事件的时候,很麻烦。而且不全。

而且简单易懂。

如何 使用EasyTouch呢, 下载好插件

http://www.sikiedu.com/course/91/task/2757/show

另外siki上讲的也是很不错的。适合新手

这下边是 EasyTouch 写好的 事件 委托, 委托呢,就类似 C++/C函数指针,可以把方法当作参数传递,

但是是类型安全的,面向对象的,可靠的受控对象, 这里 有很多种, 基本上都够用了,


	#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

Gesture类

using UnityEngine;
using System.Collections;
using System;

namespace HedgehogTeam.EasyTouch{
/// <summary>
/// This is the class passed as parameter by EasyTouch events, that containing all informations about the touch that raise the event,
/// or by the tow fingers gesture that raise the event.
/// </summary>
public class Gesture : BaseFinger,ICloneable{
	
	/// <summary>
	/// The siwpe or drag  type ( None, Left, Right, Up, Down, Other => look at EayTouch.SwipeType enumeration).
	/// </summary>
	public EasyTouch.SwipeDirection swipe;	
	/// <summary>
	/// The length of the swipe.
	/// </summary>
	public float swipeLength;				
	/// <summary>
	/// The swipe vector direction.
	/// </summary>
	public Vector2 swipeVector;			

	/// <summary>
	/// The pinch length delta since last change.
	/// </summary>
	public float deltaPinch;	
	/// <summary>
	/// The angle of the twist.
	/// </summary>
	public float twistAngle;		
	/// <summary>
	/// The distance between two finger for a two finger gesture.
	/// </summary>
	public float twoFingerDistance;

	public EasyTouch.EvtType type = EasyTouch.EvtType.None;
	
	#region public method
	public object Clone(){
		return this.MemberwiseClone();
	}

	
	/// <summary>
	/// Transforms touch position into world space, or the center position between the two touches for a two fingers gesture.
	/// </summary>
	/// <returns>
	/// The touch to wordl point.
	/// </returns>
	/// <param name='z'>
	/// The z position in world units from the camera or in world depending on worldZ value
	/// </param>
	/// <param name='worldZ'>
	/// true = r
	/// </param>
	/// 
	public Vector3 GetTouchToWorldPoint(float z){

		return  Camera.main.ScreenToWorldPoint( new Vector3( position.x, position.y,z));	

	}
	
	public Vector3 GetTouchToWorldPoint( Vector3 position3D){

		return  Camera.main.ScreenToWorldPoint( new Vector3( position.x, position.y,Camera.main.transform.InverseTransformPoint(position3D).z));	
	}


	/// <summary>
	/// Gets the swipe or drag angle. (calculate from swipe Vector)
	/// </summary>
	/// <returns>
	/// Float : The swipe or drag angle.
	/// </returns>
	public float GetSwipeOrDragAngle(){
		return Mathf.Atan2( swipeVector.normalized.y,swipeVector.normalized.x) * Mathf.Rad2Deg;	
	}

	/// <summary>
	/// Normalizeds the position.
	/// </summary>
	/// <returns>
	/// The position.
	/// </returns>
	public Vector2 NormalizedPosition(){
		return new Vector2(100f/Screen.width*position.x/100f,100f/Screen.height*position.y/100f);	
	}

	/// <summary>
	/// Determines whether this instance is over user interface element.
	/// </summary>
	/// <returns><c>true</c> if this instance is over user interface element; otherwise, <c>false</c>.</returns>
	public bool IsOverUIElement(){
		return EasyTouch.IsFingerOverUIElement( fingerIndex);
	}

	/// <summary>
	/// Determines whether this instance is over rect transform the specified tr camera.
	/// </summary>
	/// <returns><c>true</c> if this instance is over rect transform the specified tr camera; otherwise, <c>false</c>.</returns>
	/// <param name="tr">Tr.</param>
	/// <param name="camera">Camera.</param>
	public bool IsOverRectTransform(RectTransform tr,Camera camera=null){

		if (camera == null){
			return RectTransformUtility.RectangleContainsScreenPoint( tr,position,null);
		}
		else{
			return RectTransformUtility.RectangleContainsScreenPoint( tr,position,camera);
		}

	}

	/// <summary>
	/// Gets the first picked user interface element.
	/// </summary>
	/// <returns>The first picked user interface element.</returns>
	public GameObject GetCurrentFirstPickedUIElement(bool isTwoFinger=false){
		return EasyTouch.GetCurrentPickedUIElement( fingerIndex,isTwoFinger);
	}

	/// <summary>
	/// Gets the current picked object.
	/// </summary>
	/// <returns>The current picked object.</returns>
	public GameObject GetCurrentPickedObject(bool isTwoFinger=false){
		return EasyTouch.GetCurrentPickedObject( fingerIndex,isTwoFinger);
	}
	#endregion
}
}

 这个类也比较 简单 ,里有些 属性参数, ,滑动长度,滑动坐标Vector2,当然啦2D的屏幕。 除非是VR手柄,

 

EasyTouch.SwipeDirection swipe 滑动类型(方向)  有很多种, 无 左,右 ,上,下 ,左上,右上,左下,右下,其他,所有,这个比较适合 做 虚拟摇杆,

 swipeLength  :  滑动的长度,计算 方式应该就是 两点间的距离公式,第一次按下的点,松开的点。

swipeVector: 滑动矢量的方向;

deltaPinch:自上次更改以来的缩放长度。 也就是缩放长度  这个值 可以用来控制  物品缩放大小

twistAngle: 扭曲的角度

twoFingerDistance:两个手指之间的距离,两指的手势。

 EasyTouch.EvtType type  :    事件类型 轻敲,拖,滑,无,长敲 ,捏,扭,删去,获取(这个应该用的很少)

方法

  Clone(); 返回值是object类型    复制啦

 GetTouchToWorldPoin(float z);将触摸位置转换为世界空间,或者是两个手指之间的中间位置。 返回类型是 vector3类型

计算是  : Camera.main.ScreenToWorldPoint( new Vector3( position.x, position.y,z));    

这个 z是:世界单位的z位置从照相机或世界的角度看世界z的值   其实就是 与 主摄像机的远近,

GetTouchToWorldPoint( Vector3 position3D)


	public Vector3 GetTouchToWorldPoint( Vector3 position3D){

		return  Camera.main.ScreenToWorldPoint( new Vector3( position.x, position.y,Camera.main.transform.InverseTransformPoint(position3D).z));	
	}

 这个 是 传进来的位置的全局坐标,转换为, 相对 main Camera的  本地 坐标,受缩放影响 

InverseTransformPoint:将位置从世界坐标转换为本地坐标,受缩放影响。

坐标转换知识:

坐标系转换

由于坐标系存在本地坐标系和世界坐标系两种,那么就需要有方法可以对这两种坐标系进行转换。

  • transform.localToWorldMatrix:本地坐标转世界坐标的矩阵信息。
  • transform.worldToLocalMatrix:世界坐标转本地坐标的矩阵信息。
  • transform.TransformDirection:将方向从本地坐标转换为世界坐标,不受缩放影响。
  • transform.InverseTransformDirection:将方向从世界坐标转换为本地坐标,不受缩放影响。
  • transform.TransformPoint:将位置从本地坐标转换为世界坐标,受缩放影响。
  • transform.InverseTransformPoint:将位置从世界坐标转换为本地坐标,受缩放影响。
  • transform.TransformVector:将坐标点从本地坐标转换为世界坐标,不受位置影响但受缩放影响。
  • transform.InverseTransformVector:将坐标点从世界坐标转换为本地坐标,不受位置影响但受缩放影响

OK.

这个position 就是 用户当前点击的点的坐标,这边 已经封装好了。

 GetSwipeOrDragAngle()

public float GetSwipeOrDragAngle(){
		return Mathf.Atan2( swipeVector.normalized.y,swipeVector.normalized.x) * Mathf.Rad2Deg;	
	}

获取 滑动 或者 拖动的角度 还好职高的时候学了点三角函数...

Atan2() 反正切

Mathf.Atan2反正切

static function Atan2 (y : float, x :float) : float

以弧度为单位计算并返回 y/x 的反正切值。返回值表示相对直角三角形对角的角,其中 x 是临边边长,而 y 是对边边长。

返回值是在x轴和一个二维向量开始于0个结束在(x,y)处之间的角。

NormalizedPosition()    标准化 位置,归一化

	public Vector2 NormalizedPosition(){
		return new Vector2(100f/Screen.width*position.x/100f,100f/Screen.height*position.y/100f);	
	}

 IsOverUIElement() 确定这个实例是否超过了用户界面元素。

	public bool IsOverUIElement(){
		return EasyTouch.IsFingerOverUIElement( fingerIndex);
	}

 IsOverRectTransform(RectTransform tr,Camera camera=null) 

确定这个实例是否在矩形转换指定的矩形tr摄像机。

public bool IsOverRectTransform(RectTransform tr,Camera camera=null){

		if (camera == null){
			return RectTransformUtility.RectangleContainsScreenPoint( tr,position,null);
		}
		else{
			return RectTransformUtility.RectangleContainsScreenPoint( tr,position,camera);
		}

	}

RectTransformUtility.RectangleContainsScreenPoint 从指定摄像机中观看该矩形变换是否包含屏幕点?

 GetCurrentFirstPickedUIElement(bool isTwoFinger=false) 获得第一个选择的用户界面元素

	public GameObject GetCurrentFirstPickedUIElement(bool isTwoFinger=false){
		return EasyTouch.GetCurrentPickedUIElement( fingerIndex,isTwoFinger);
	}

  GetCurrentPickedObject(bool isTwoFinger=false) 获得当前择的对象

	public GameObject GetCurrentPickedObject(bool isTwoFinger=false){
		return EasyTouch.GetCurrentPickedObject( fingerIndex,isTwoFinger);
	}

通过 fingersIndex 去获取。 getFinger 方法 一共有10个手指

Gesture 总算看完了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值