Unity 单指与双指Touch事件捕获
来源:互联网 发布:京东数据分析笔试 编辑:程序博客网 时间:2024/03/29 16:54
最近整理了一下项目用到的touch事件捕获管理逻辑,贴出来,算是记一下。
using UnityEngine;using System.Collections;using UnityEngine.EventSystems;public delegate void TouchEventHandler(TouchEventArgs args);public class TouchManager : MonoBehaviour { public static TouchManager instance; private static bool isInited = false; public static bool IsInited() { return (null != instance && isInited); } public static TouchManager GetInstance() { return instance; } public event TouchEventHandler onFirstTouchBegan; public event TouchEventHandler onFirstTouchMoved; public event TouchEventHandler onFirstTouchEnded; public event TouchEventHandler onTwoTouchMoved; private Vector2 touchStartPos; private bool getTwoTouch; private float disBtwTouch; private bool isMouseDown; public void Start() { onFirstTouchBegan = new TouchEventHandler(InitFirstBeganHandler); onFirstTouchMoved = new TouchEventHandler(InitFirstMovedHandler); onFirstTouchEnded = new TouchEventHandler(InitFirstEndedHandler); onTwoTouchMoved = new TouchEventHandler(InitTwoMovedHandler); touchStartPos = Vector2.zero; getTwoTouch = false; isMouseDown = false; instance = this; isInited = true; } private void InitFirstBeganHandler(TouchEventArgs args) { //Debug.Log("InitFirstBeganHandler " + args.ToString()); } private void InitFirstMovedHandler(TouchEventArgs args) { //Debug.Log("InitFirstMovedHandler " + args.ToString()); } private void InitFirstEndedHandler(TouchEventArgs args) { //Debug.Log("InitFirstEndedHandler " + args.ToString()); } private void InitTwoMovedHandler(TouchEventArgs args) { //Debug.Log("InitTwoMovedHandler " + args.ToString()); } void Update() { if (Application.platform == RuntimePlatform.Android || Application.platform == RuntimePlatform.IPhonePlayer) { GetTouchEvent(); } else { GetMouseEvent(); } } private void GetTouchEvent() { if (Input.touchCount == 0) { getTwoTouch = false; return; } if (EventSystem.current.IsPointerOverGameObject(Input.GetTouch(0).fingerId)) { getTwoTouch = false; return; } if (Input.touchCount == 1) { Touch firstTouch = Input.GetTouch(0); if (firstTouch.phase == TouchPhase.Began) { touchStartPos = firstTouch.position; onFirstTouchBegan(new TouchEventArgs(touchStartPos, 0)); return; } if (firstTouch.phase == TouchPhase.Moved) { if (getTwoTouch) return; Vector2 deltaMv = firstTouch.position - touchStartPos; onFirstTouchMoved(new TouchEventArgs(touchStartPos, 0)); touchStartPos = firstTouch.position; return; } if (firstTouch.phase == TouchPhase.Ended) { if (getTwoTouch) return; onFirstTouchEnded(new TouchEventArgs(touchStartPos, 0)); return; } return; } else if (Input.touchCount == 2) { Touch firstTouch = Input.GetTouch(0); Touch secondTouch = Input.GetTouch(1); float curDis = UnityHelper.GetGenScreenDis(firstTouch.position, secondTouch.position); if (IsTouchDown(firstTouch) || IsTouchDown(secondTouch)) { if (!getTwoTouch) { getTwoTouch = true; disBtwTouch = curDis; return; } float deltaDis = curDis - disBtwTouch; onTwoTouchMoved(new TouchEventArgs(Vector2.zero, deltaDis)); disBtwTouch = curDis; return; } getTwoTouch = true; return; } } private bool IsTouchDown(Touch touch) { return (touch.phase == TouchPhase.Stationary || touch.phase == TouchPhase.Moved); } private void GetMouseEvent() { if (EventSystem.current.IsPointerOverGameObject()) { return; } float wheelValue = Input.GetAxis("Mouse ScrollWheel"); if (wheelValue != 0) { onTwoTouchMoved(new TouchEventArgs(Vector2.zero, wheelValue)); } if (Input.GetMouseButtonDown(0)) { touchStartPos = Input.mousePosition; onFirstTouchBegan(new TouchEventArgs(touchStartPos, 0)); isMouseDown = true; return; } if (Input.GetMouseButtonUp(0)) { touchStartPos = Input.mousePosition; onFirstTouchEnded(new TouchEventArgs(touchStartPos, 0)); isMouseDown = false; return; } if(Input.GetMouseButton(0)) { if (!isMouseDown) { return; } Vector2 deltaMv = ((Vector2)Input.mousePosition) - touchStartPos; if (Vector2.zero == deltaMv) { return; } onFirstTouchMoved(new TouchEventArgs(touchStartPos, 0)); touchStartPos = Input.mousePosition; return; } }}public class TouchEventArgs : System.EventArgs { public Vector2 touchedPos; public float twoMvDis; public TouchEventArgs(Vector2 pos, float mvDis) { touchedPos = UnityHelper.GetGenScreenPos(pos); twoMvDis = mvDis; } public override string ToString() { return string.Format("touchedPos: {0}\t twoMvDis: {1}", touchedPos, twoMvDis); }} public class UnityHelper{ /// <summary> /// 获取通用的屏幕坐标,即忽略dpi的坐标 /// </summary> public static Vector2 GetGenScreenPos(Vector2 originPos) { Vector2 result = originPos; result.x /= (1.000f * Screen.width); result.y /= (1.000f * Screen.height); return result; } /// <summary> /// 根据通用屏幕坐标计算出当前的实际屏幕坐标 /// </summary> /// <param name="genPos"></param> /// <returns></returns> public static Vector2 GetScreenPosFromGen(Vector2 genPos) { Vector2 result = genPos; result.x *= Screen.width; result.y *= Screen.height; return result; } /// <summary> /// 计算通用的屏幕距离,即可以忽略dpi的规范距离 /// </summary> /// <param name="pos1"></param> /// <param name="pos2"></param> /// <returns></returns> public static float GetGenScreenDis(Vector2 pos1, Vector2 pos2) { return Vector2.Distance(GetGenScreenPos(pos1), GetGenScreenPos(pos2)); }}
使用方法,在保证TouchManager初始化完全的情况下,调用:
TouchManager.GetInstance().onTwoTouchMoved += OnDoubleTouchMoved;添加两指相对运动的事件响应逻辑。
不需要响应了,则调用:
TouchManager.GetInstance().onTwoTouchMoved -= OnDoubleTouchMoved;
就可以了。 附上OnDoubleTouchMoved函数原型:
private void OnDoubleTouchMoved(TouchEventArgs args) { Debug.Log("OnDoubleTouchMoved :" + args.ToString() ); }
0 0
- Unity 单指与双指Touch事件捕获
- 关于移动端触屏输入控制的API的使用汇总(二)_Unity 单指与双指Touch事件捕获(网友项目使用总结)
- 事件捕获与冒泡
- touch事件与click事件
- 事件冒泡与事件捕获
- 事件捕获与事件冒泡
- 事件冒泡与事件捕获
- 事件捕获与事件冒泡
- 事件冒泡与事件捕获
- 事件捕获与事件冒泡
- 事件捕获与事件冒泡
- 事件冒泡与事件捕获
- 事件冒泡与事件捕获
- 事件冒泡与事件捕获
- 事件冒泡与事件捕获
- 事件冒泡与事件捕获
- 事件冒泡、事件捕获与事件委托
- cocos2dx-lua捕获用户touch事件的几种方式
- 程序员求职,有时与能力无关
- PDE7 wave equation: intuition
- tomcat启动过程:main(String args[])总览
- 软件开发流程
- PDE8 wave equation: derivation
- Unity 单指与双指Touch事件捕获
- 开发进度月报
- MySQL语句链接
- LA 3270 - Simplified GSM Network
- 搜索练习题
- js性能优化
- 最小生成树&&次小生成树
- 移动互联之-- React Native
- [leetcode 64] Minimum Path Sum------从左上角到右下角的最小路径值