Unity触控——单指、双指、Windows大屏多人触控
前段时间做了个Windows系统的大屏触控程序,最多同时支持十点触控,并且在各自的小窗口中要分别处理,即每个小窗口中的触点为一个处理组,判断其单点或多点操作。按以往移动端程序的触屏事件Input.GetTouch(int index)不满足需求,着实费了一番功夫。
首先分享常用的移动端触控方法,单指、双指操作。这里举例为单指操作模型旋转,双指同向移动操作模型平移,双指反向移动操作模型缩放。单指操作不再赘述,双指操作我选用向量判断。
public void SingleTouch(){Debug.Log("SingleTouch"); if (Input.GetTouch(0).phase == TouchPhase.Began || !isSingleFinger){//在开始触摸或者从两字手指放开回来的时候记录一下触摸的位置 preSingleTouchPosition = Input.GetTouch(0).position;}if (Input.GetTouch(0).phase == TouchPhase.Moved){currentModel.transform.Rotate(Vector3.up, -Input.GetTouch(0).deltaPosition.x * 0.5f); preSingleTouchPosition = Input.GetTouch(0).position;}isSingleFinger = true;}public void DoubleTouch(){Debug.Log("DoubleTouch:" + Vector2.Distance(Input.GetTouch(0).position, Input.GetTouch(1).position));if (isSingleFinger){oldPosition1 = Input.GetTouch(0).position;oldPosition2 = Input.GetTouch(1).position;beginTouchDistance = Vector2.Distance(Input.GetTouch(0).position, Input.GetTouch(1).position);currentScale = currentModel.transform.localScale;currentPosition = currentModel.transform.localPosition;}if (Input.GetTouch(0).phase == TouchPhase.Moved && Input.GetTouch(1).phase == TouchPhase.Moved){Vector2 xiangliang1 = Input.GetTouch(0).position - oldPosition1;Vector2 xiangliang2 = Input.GetTouch(1).position - oldPosition2; float dir = Vector2.Dot(xiangliang1.normalized, xiangliang2.normalized);if (dir <= 1 && dir >= 0){currentModel.transform.Translate(Input.GetTouch(0).deltaPosition.x * 0.01f, Input.GetTouch(1).deltaPosition.y * 0.01f, 0, Space.World);}else if (dir >= -1 && dir < 0){float currentTouchDistance = Vector2.Distance(Input.GetTouch(0).position, Input.GetTouch(1).position);float tmpScale = currentTouchDistance / beginTouchDistance - 1f;tmpScale += currentScale.x;tmpScale = Mathf.Clamp(tmpScale, 0.5f, 3f);currentModel.transform.localScale = Vector3.one * tmpScale;}}isSingleFinger = false;}
以上为移动端常用的触控方法,接下来简述一下Windows大屏触控。
首先来说,需求为在大屏上点击弹出小窗口,窗口中会有所点模型的操作,平移、旋转、缩放以及UI控制的动画等展示。因所选大屏最多支持十点触控,故限制小窗口最多生成5个,且每个小窗口需要独立操作,即在窗口1内的操作不会影响其他窗口或窗口外的点击事件,并且窗口1外的触控同样不影响窗口1内的操作。所以这里需要面向对象的概念,将触点作为对象,创建类。这里由于功能并不复杂,小窗口作为预制体生成,所以只需定义一个点击的窗口对应的UI控制组件和一个触点集合,就可以完成需求。
public class A
{public UIManager obj;//自定义UI控制脚本public List<Touch> touch = new List<Touch>();
}
然后实例这个类进行处理,这里我只判断了点在哪个窗口内,然后将窗口内所有点存入集合,方便在控制脚本里调用并响应相应的事件。
public void ClickObject(){Debug.Log("ClickObject");a = new List<A>();for (int i = 0; i < Input.touchCount; i++){eventDataCurrentPosition.position = Input.GetTouch(i).position;List<RaycastResult> results = new List<RaycastResult>();EventSystem.current.RaycastAll(eventDataCurrentPosition, results);if(results.Count > 0){if (results[0].gameObject.transform.parent.GetComponent<UIManager>() != null){if(a.Count == 0){A a1 = new A();a1.obj = results[0].gameObject.transform.parent.GetComponent<UIManager>();a1.touch.Add(Input.GetTouch(i));a.Add(a1);}else{int aa = a.Count;for (int j = 0; j < aa; j++){if(a[j].obj == results[0].gameObject.transform.parent.GetComponent<UIManager>()){a[j].touch.Add(Input.GetTouch(i));}else{A a1 = new A();a1.obj = results[0].gameObject.transform.parent.GetComponent<UIManager>();a1.touch.Add(Input.GetTouch(i));a.Add(a1);}}}}}}}
要注意,由于小窗口使用UI组件显示,因此需要先保证EventSystem的存在,PointerEventData eventDataCurrentPosition = new PointerEventData(EventSystem.current),否则窗口中的点击将无法触发,也就无法记录并进行后续操作。
对象类及分组处理已完成,接下来向单指、双指的触控方法中传参即可,需根据实际需求及应用环境进行处理,这里就不作过多描述。
Unity触控——单指、双指、Windows大屏多人触控相关推荐
- android 投屏与反控,大屏也能反控手机了,type-c接口的无线投屏器带来的改变
原标题:大屏也能反控手机了,type-c接口的无线投屏器带来的改变 大屏也能反控手机了,type-c接口的无线投屏器带来的改变 2020年9月中旬的时候,AWIND奇机type-c接口的无线投屏器隆重 ...
- 解码拼控设备输出线接大屏后,大屏仍显示无信号怎么办?
可能造成无信号的原因有: 输出口异常 交叉视频线缆测试后,依旧无信号,则基本可认为输出口异常 2.信号衰减问题 线缆太长,建议换短的线缆,降低解码器的输出分辨率后有信号,则可能是线缆信号衰减严重,更换 ...
- LED大屏实现“人屏”互动的方式有哪些?
一直以来,传统的LED大屏都是以"单向传播"的方式面向受众,这种方式不仅"被动",而且渐渐也缺乏动感和新意.加之近年来,"大屏触碰"技术的发 ...
- android平板触控笔,大屏顶配触控笔,这才是最强安卓平板
据了解,三星将于北京时间 8 月 8 日凌晨四点举办下半年旗舰 Galaxy Note 10 系列的新品发布会. 在这之前的一个星期,三星先给大家上了一道前菜--Galaxy Tab S6 平板电脑. ...
- 浏览器端大屏百度地图常用控件 3D/2D 测距 地图风格 卫星地图 路况...
前提:成为百度地图开发者并获取的百度地图key https://lbsyun.baidu.com/ 示例: https://lbsyun.baidu.com/jsdemo.htm#aCreateMap ...
- Unity 插件之 AVPro Movie Capture Windows 录屏插件
导入 AVPro Movie Capture Windows.3.3.1.unitypackage 点击"Assets"--点击"Input package"- ...
- Unity实现 双指触摸放大缩小镜头 单指平移镜头
一.使用场景需要全场景观察模型和放大看模型局部细节的时候 二.具体的脚本内容如下: /*** * Title:"三维可视化" 项目 * 主题:手势控制物体的旋转缩放 * Descr ...
- 黑苹果没有找到触控板为什么还是能用_为什么Macbook触控板体验领先Windows那么多,却难以取代鼠标?...
用年轻的心态看缤纷的世界 关于Mac优异的触控板体验这个问题,早已名声在外,用户的评价几乎也都是出奇的一致,那就是"方便,好用".相信很多人也都是"未用其本,先闻其名&q ...
- 从小屏到大屏,触控技术的现在与未来
在为期两天的国际便携技术系列上,笔者听到演讲嘉宾不止一次提到"多点触控""电容式触控"等概念,苹果推出的iPhone系列带动了整个电容式触控屏市场,从小屏到大屏 ...
最新文章
- 分享一个 markdown 编辑器 - Mditor
- PMCAFF | 别学东学西了,先建立自己的知识体系吧
- java==和=_java中==和 equal区别
- 信息系统项目管理师-项目采购管理核心知识点思维脑图
- 重建二叉树(基于js)
- 【agc004f】Namori Grundy
- 【spider】多线程爬虫
- c++ 标准库类型string
- c++ tcp 封装_关于TCP三次握手和四次挥手问题,求你别再问了问了...
- ssrs批量权限管理_管理SSRS安全性并使用PowerShell自动化脚本
- 国家开放大学2021春1070组织行为学题目
- Windows Phone 7 开发探索笔记1——触控操作之Touch
- Hadoop完全分布安装详细过程--------****--------(ubuntu版本)
- Texture贴图材质资源网站分享
- 正态总体均值假设检验
- 52 jQuery-使用fadeIn()和fadeOut()方法实现淡入淡出效果
- win10启用smb3多通道_关于win10无法使用smb访问局域网内的计算机
- 《14天从0到1学Java》第一天之04第一行Java代码
- dva的用法_dva基本用法
- Java基础——IO流