前段时间做了个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大屏多人触控相关推荐

  1. android 投屏与反控,大屏也能反控手机了,type-c接口的无线投屏器带来的改变

    原标题:大屏也能反控手机了,type-c接口的无线投屏器带来的改变 大屏也能反控手机了,type-c接口的无线投屏器带来的改变 2020年9月中旬的时候,AWIND奇机type-c接口的无线投屏器隆重 ...

  2. 解码拼控设备输出线接大屏后,大屏仍显示无信号怎么办?

    可能造成无信号的原因有: 输出口异常 交叉视频线缆测试后,依旧无信号,则基本可认为输出口异常 2.信号衰减问题 线缆太长,建议换短的线缆,降低解码器的输出分辨率后有信号,则可能是线缆信号衰减严重,更换 ...

  3. LED大屏实现“人屏”互动的方式有哪些?

    一直以来,传统的LED大屏都是以"单向传播"的方式面向受众,这种方式不仅"被动",而且渐渐也缺乏动感和新意.加之近年来,"大屏触碰"技术的发 ...

  4. android平板触控笔,大屏顶配触控笔,这才是最强安卓平板

    据了解,三星将于北京时间 8 月 8 日凌晨四点举办下半年旗舰 Galaxy Note 10 系列的新品发布会. 在这之前的一个星期,三星先给大家上了一道前菜--Galaxy Tab S6 平板电脑. ...

  5. 浏览器端大屏百度地图常用控件 3D/2D 测距 地图风格 卫星地图 路况...

    前提:成为百度地图开发者并获取的百度地图key https://lbsyun.baidu.com/ 示例: https://lbsyun.baidu.com/jsdemo.htm#aCreateMap ...

  6. Unity 插件之 AVPro Movie Capture Windows 录屏插件

    导入 AVPro Movie Capture Windows.3.3.1.unitypackage 点击"Assets"--点击"Input package"- ...

  7. Unity实现 双指触摸放大缩小镜头 单指平移镜头

    一.使用场景需要全场景观察模型和放大看模型局部细节的时候 二.具体的脚本内容如下: /*** * Title:"三维可视化" 项目 * 主题:手势控制物体的旋转缩放 * Descr ...

  8. 黑苹果没有找到触控板为什么还是能用_为什么Macbook触控板体验领先Windows那么多,却难以取代鼠标?...

    用年轻的心态看缤纷的世界 关于Mac优异的触控板体验这个问题,早已名声在外,用户的评价几乎也都是出奇的一致,那就是"方便,好用".相信很多人也都是"未用其本,先闻其名&q ...

  9. 从小屏到大屏,触控技术的现在与未来

    在为期两天的国际便携技术系列上,笔者听到演讲嘉宾不止一次提到"多点触控""电容式触控"等概念,苹果推出的iPhone系列带动了整个电容式触控屏市场,从小屏到大屏 ...

最新文章

  1. 分享一个 markdown 编辑器 - Mditor
  2. PMCAFF | 别学东学西了,先建立自己的知识体系吧
  3. java==和=_java中==和 equal区别
  4. 信息系统项目管理师-项目采购管理核心知识点思维脑图
  5. 重建二叉树(基于js)
  6. 【agc004f】Namori Grundy
  7. 【spider】多线程爬虫
  8. c++ 标准库类型string
  9. c++ tcp 封装_关于TCP三次握手和四次挥手问题,求你别再问了问了...
  10. ssrs批量权限管理_管理SSRS安全性并使用PowerShell自动化脚本
  11. 国家开放大学2021春1070组织行为学题目
  12. Windows Phone 7 开发探索笔记1——触控操作之Touch
  13. Hadoop完全分布安装详细过程--------****--------(ubuntu版本)
  14. Texture贴图材质资源网站分享
  15. 正态总体均值假设检验
  16. 52 jQuery-使用fadeIn()和fadeOut()方法实现淡入淡出效果
  17. win10启用smb3多通道_关于win10无法使用smb访问局域网内的计算机
  18. 《14天从0到1学Java》第一天之04第一行Java代码
  19. dva的用法_dva基本用法
  20. Java基础——IO流

热门文章

  1. 网页|如何制作一个HTML网页
  2. 搜索引擎蜘蛛抓取配额是什么?
  3. 【Python 习题总结3】三种出路
  4. Ethereum以太坊区块链底层换用国密算法实验报告
  5. tar文件是什么?怎么解压?
  6. 模糊查询以及动态sql
  7. pycharm注释快捷键Ctrl+/
  8. 「转」二级语法知识总结
  9. Web应用界面设计规范—给项目组培训 .
  10. Zemax---Seidel(赛德尔图的查看方法)(完结)