关于移动端触屏输入控制的API的使用汇总(二)_Unity 单指与双指Touch事件捕获(网友项目使用总结)
来源:互联网 发布:php字符串替换 编辑:程序博客网 时间:2024/04/29 20:22
关于移动端触屏输入控制的API的使用汇总(二)_Unity 单指与双指Touch事件捕获(网友项目使用总结)
原文出处http://blog.csdn.net/reipeng/article/details/50960178
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() ); }
阅读全文
1 0
- 关于移动端触屏输入控制的API的使用汇总(二)_Unity 单指与双指Touch事件捕获(网友项目使用总结)
- 关于移动端触屏输入控制的API的使用汇总(三)_Unity Android手机触屏事件
- 关于移动端触屏输入控制的API的使用汇总(一)
- Unity 单指与双指Touch事件捕获
- 移动端的touch事件(二)
- Android Touch事件总结 二 (双指实现RecyclerView的快速滚动)
- 使用key事件控制输入框输入的范围
- 移动控制的使用
- 移动前端—touch事件与click事件的区别
- 移动端的touch事件
- [Phonegap+Sencha Touch] 移动开发7、Sencha Touch图标的使用与自定义
- [Phonegap+Sencha Touch] 移动开发7、Sencha Touch图标的使用与自定义
- 移动端开发 原生touch事件使用
- js控制特殊字符的输入配合onkeypress事件使用
- H5移动页面的touch事件与点击穿透问题
- 4.移动端的事件冒泡与捕获
- CocosCreator项目学习系列<二>关于Button(添加事件)输入控制交互条件的触发_实现虚拟按钮控制_JavaScript
- 使用c#捕获windows的关机事件
- 传值设置mybatis查询的 列名(字段名),以及如何查看mybatis中执行的SQL语句
- 51Nod 1289 大鱼吃小鱼 模拟
- OGG(ORACLE GOLDENGATE)使用手册
- Python之itchat生成微信头像拼接问题
- 7.1
- 关于移动端触屏输入控制的API的使用汇总(二)_Unity 单指与双指Touch事件捕获(网友项目使用总结)
- 写博客前后的一些感悟
- 自己写的1049. 数列的片段和(20)
- [HNOI2004]宠物收养场 Treap
- Kafka集群+zookeeper集群安装教程
- 哈夫曼编码-二叉树应用
- 设计模式—建造者模式
- 浅谈半导体
- (算法分析Week12)Unique Paths[Medium]