【Unity】EasyTouch5触屏检测
Unity AssetStore地址
https://assetstore.unity.com/packages/tools/input-management/easy-touch-5-touchscreen-virtual-controls-3322
从插件名Easy Touch 5 : Touchscreen & Virtual Controls可知,该插件包含了EasyTouch Lite(触摸检测)和Easy Touch Controls(虚拟摇杆)。所以导入项目后能看到下图EasyTouch(触屏检测)和EasyTouchControls(虚拟摇杆)两个文件夹,根据需要查看Demo和文档,别搞错啦。官方Demo放在EasyTouchBundle\EasyTouch\Examples\4.X\SimpleExamples目录中。
Easy Touch4.X老版本的用法
导入EasyTouch插件后,在场景中右键新建EasyTouch—EasyTouch物体,该物体身上的EasyTouch脚本是使用该插件的关键,场景中没有物体挂该脚本,就没法使用插件的功能。
看文档,基于订阅事件的方式。自定义脚本,在OnEnable()中订阅事件,在OnDisable()和OnDestroy()中取消订阅。
using System.Collections; using System.Collections.Generic; using UnityEngine; using HedgehogTeam.EasyTouch; public class EasyTouch4Demo : MonoBehaviour { // 订阅EasyTouch中的事件 private void OnEnable() { // 把自定义的事件加到EasyTouch的调用列表中即可 EasyTouch.On_TouchStart += OnTouchStart; EasyTouch.On_TouchUp += OnTouchEnd; EasyTouch.On_Swipe += OnSwipe; } // 取消EasyTouch中的事件订阅 private void OnDisable() { EasyTouch.On_TouchStart -= OnTouchStart; EasyTouch.On_TouchUp -= OnTouchEnd; EasyTouch.On_Swipe -= OnSwipe; } // 取消EasyTouch中的事件订阅 private void OnDestroy() { EasyTouch.On_TouchStart -= OnTouchStart; EasyTouch.On_TouchUp -= OnTouchEnd; EasyTouch.On_Swipe -= OnSwipe; } /* * 下面是自定义的方法,用于订阅EasyTouch中的事件。 * 都要求传参HedgehogTeam.EasyTouch.Gesture */ void OnTouchStart(Gesture gesture) { Debug.Log("OnTouchStart"); Debug.Log("startPosition : " + gesture.startPosition); } void OnTouchEnd(Gesture gesture) { Debug.Log("OnTouchEnd"); Debug.Log("actionTime : " + gesture.actionTime); } void OnSwipe(Gesture gesture) { Debug.Log("OnSwipe"); Debug.Log("swipe : " + gesture.swipe); } }
运行后鼠标按屏幕滑动即可看到打印输出。
Easy Touch5.X新版本的用法
using System.Collections; using System.Collections.Generic; using UnityEngine; using HedgehogTeam.EasyTouch; public class EasyTouch5Demo : MonoBehaviour { // 演示EasyTouch5.x版本的新特新,可不用谢订阅事件等一套语句 private void Update() { // 当前帧的当前手势 Gesture currentGesture = EasyTouch.current; if (currentGesture != null) // 不操作时,当前帧的手势返回空,要做为空判断 { if (EasyTouch.EvtType.On_TouchStart == currentGesture.type) { //OnTouchStart(currentGesture); // 写法1:直接在Update中写逻辑 Debug.Log("OnTouchStart"); Debug.Log("startPosition : " + currentGesture.startPosition); } if (EasyTouch.EvtType.On_TouchUp == currentGesture.type) { // 写法2:将逻辑抽取为方法,调用方法 OnTouchEnd(currentGesture); } if (EasyTouch.EvtType.On_Swipe == currentGesture.type) { OnSwipe(currentGesture); } } } /* * 下面是自定义的方法,用于订阅EasyTouch中的事件。 * 都要求传参HedgehogTeam.EasyTouch.Gesture */ void OnTouchStart(Gesture gesture) { Debug.Log("OnTouchStart"); Debug.Log("startPosition : " + gesture.startPosition); } void OnTouchEnd(Gesture gesture) { Debug.Log("OnTouchEnd"); Debug.Log("actionTime : " + gesture.actionTime); } void OnSwipe(Gesture gesture) { Debug.Log("OnSwipe"); Debug.Log("swipe : " + gesture.swipe); } }
5.X中的EasyTouch是静态单例,可不用在场景中创建EasyTouch对象,运行时会自动创建。但是建议手动新建该物体,因为可以在编辑器中修改EasyTouch脚本的各项属性,而不用在代码中运行时去修改。
Easy Touch5.X新特性——QuickGesture
在给物体添加组件时,可以看到多了EasyTouch选项组,里面一系列Quick开头的脚本(如QuickDrag,QuickSwipe等)都统称为QuickGesture。该特性强大之处在于,加上该脚本就能直接操作物体,如加上QuickDrag后就能使物体可拖拽移动,而不用像之前的写法在监听事件中还要自己写物体位移逻辑,非常的方便!QuickGesture脚本同样可以绑定事件触发的自定义方法。
QuickGesture组件(脚本)有如下:
- Quick Drag:拖拽
- Quick Enter Over Exist:手指进入、悬浮、离开物体
- Quick Long Tap:长按。若要同时监听开始、按下中、结束三个事件,需要给同一物体添加三个该组件。
- Quick Pinch:缩放。同上,三个事件三个组件。(坑:勾上Gesture over me属性时,两指的连线在物体中,也算是手指在物体内,也会触发事件。)
- Quick Swipe:屏幕滑动。可自定义滑动时物体的Transform如何变化,如绕着Y轴旋转等。滑动与拖拽的区别在于,按下时是否有可响应EasyTouch事件的物体,没有测判定为滑动,有则判定为拖拽。
- Quick Tap:点击。可设置单指或双指,也可设置是单击或双击。同一物体中不要同时添加两个该组件来分别监听单击和双击,否则双击时也会触发单击事件。
- Quick Touch:触摸。同样是单一物体挂三个该脚本分别监听按下、按下时、弹起。其中弹起时还分为在物体内松手和在物体外松手的事件。
- Quick Twist:扭曲,顺时针或逆时针的手势,需要双指。同样可用两个组件分别触发扭曲时和扭曲结束的事件。
Easy Touch5.X新特性——EasyTouchTrigger
先编写一个C#逻辑脚本文件。
using System.Collections; using System.Collections.Generic; using UnityEngine; /// <summary> /// EasyTouch5.x新特新--EasyTouchTrigger /// </summary> public class EasyTouchTriggerDemo : MonoBehaviour { public void PrintMsg(GameObject go) { if (go == null) { Debug.Log("Null"); } else { Debug.Log(go.name); } } public void PrintOK() { Debug.Log("OK"); } }
然后给物体挂上上面的脚本,添加EasyTouch--Trigger组件,自行添加各种事件Add Event及其回调。
注意点:
- 同一手势事件中,可触发多个回调函数。如上图中On_TouchStart事件触发了PrintMsg()和PrintOK()函数。
- 能触发的函数必须是当前物体身上所挂载的脚本中的某一方法。即若物体没有添加上图的EasyTouchTriggerDemo.cs脚本,就不能触发脚本内的方法。
其他Tips
- Quick Pinch和Quick Twist的End事件似乎会冲突,抬手时无法区分。
- QuickGesture中大部分检测手势在物体内才能触发的事件,都要求物体有Collider碰撞器组件。
- EasyTouch支持在PC端开发时模拟双指操作,场景中添加EasyTouch物体(挂有EasyTouch脚本),运行时按Ctrl或Alt后点击鼠标试试。