Unity触控——单指、双指、Windows大屏多人触控

2023-11-15

前段时间做了个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),否则窗口中的点击将无法触发,也就无法记录并进行后续操作。

对象类及分组处理已完成,接下来向单指、双指的触控方法中传参即可,需根据实际需求及应用环境进行处理,这里就不作过多描述。

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Unity触控——单指、双指、Windows大屏多人触控 的相关文章

  • Unity 资源加载卸载过程

    什么时候才是UnusedAssets 看一个例子 Object obj Resources Load MyPrefab GameObject instance Instantiate obj as GameObject Destroy in
  • 蒙特卡洛积分、重要性采样、低差异序列

    渲染公式 渲染的目标在于计算周围环境的光线有多少从表面像素点反射到相机视口中 要计算总的反射光 每个入射方向的贡献 必须将他们在半球上相加 为入射光线 与法线 的夹角 为方便计算可以使用法线向量和入射向量 单位化 的乘积表示 对于基于图像的
  • unity制作一个可以自由滑动收缩的历史记录功能。

    公司在做一款模拟经营类的卖车游戏 需要一个简单的历史记录功能 放在左上角 记录最近20条的收入 支出记录 超过2秒不动则收起 收起时展示最近的一个消息记录 用到的组件是ScrollView 使用方法可以参考我写过的一篇博客 ScrollVi
  • Unity 分块延迟渲染01 (TBDR)

    现代移动端图形体系结构的概述 现代SoC通常会同时集成CPU和GPU CPU被用于处理需要低内存延迟的序列 大量分支的数据集 其晶体管用于流控制和数据缓存 GPU为处理大型 未分支的数据集 如3D渲染 晶体管专用于寄存器和算术逻辑单元 而不
  • FBX导入Unity中模型没有材质的处理

    一 3dMax导出FBX时的注意事项 导出时 确保maps文件存在 里面放着fbx用到的image 二 在Unity中的设置 1 文件拖入Unity的Assets文件夹中 2 查看模型的材质是否存在 如下所示 材质为None 此时拖入sce
  • Unity动画控制器animator.CrossFade

    需要特别注意 1 CrossFade虽然可以不用任何逻辑来链接而直接跳转 但是CrossFade只能覆盖其他动画 当当前动画播放完毕而没有跳出这个动画时再次调用CrossFade将会失败 造成动画依旧停在原位 参数animator Cros
  • Unity3d 插件 系列——DoTweenPro介绍(图文详细+案例)

    Unity3d 插件 系列 DoTweenPro介绍 图文详细 案例 前言 一 DoTweenPro简介 二 DoTweenPro安装 三 DoTweenPro主要组件 1 DoTweenAnimation 2 DoTweenPath 3
  • Unity中UI框架的使用1-添加面板、显示Loading页面

    其中BasePanel和Canvas都是挂在面板的预制物上的 1 导入我们的UI框架 本篇文章中有用的是两个UIPanelType NUIManager和NBasePanel 会放在文章最后供大家使用 2 先将我们做好的Panel设置成预制
  • Unity学习笔记(一)—— 基础知识

    一 基础知识 1 开发团队组成 2 unity特点 图形界面 所见即所得 入门简单 支持C 比OC C 更友好 js 国内外资源丰富 因为使用的人多 跨平台性好 PC端 移动端等 对VR AR的支持最完善 3 成功案例 游戏 炉石传说 神庙
  • unity后台加密时间锁

    前言 在做一些项目的时候 有些不良甲方在给完项目后会有不给尾款的情况 之前都是加一些水印啥的 感觉不是很方便 第一不美观 第二如果甲方给完尾款后还得重新打包去水印 然后又做过一个本地的时间锁 等到时间 程序直接退出 但是感觉还是不方便 有时
  • unity3d大型互动照片墙

    1 本次应客户需求 制作一个大型照片墙互动 输出分辨率为9600 4320 注 unity3d官方推荐最大分辨率为8192 3686 4 经过现场长达24小时暴力测试中途未发生问题 姑且判定可以达到正常标准 废话不多说 先上效果 unity
  • Unity保存图片到相册

    Unity保存图片到Android相册 Java 纯文本查看 复制代码 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
  • unity实现鼠标右键控制视角

    主要实现的功能是相机跟随主角 鼠标右击移动后 相机的视角会旋转 思路 在主角里创建空的子物体 把相机绑在空物体上 通过旋转空物体来实现视角的旋转 要把相机调整到适当位置 代码如下 public float rotateSpeed 100 设
  • unity dots jobSystem 记录

    Looking for a way to get started writing safe multithreaded code Learn the principles behind our Job System and how it w
  • 一文入门Python面向对象编程(干货满满)

    在开始之前 我一直企图找到一个通俗直观的例子来介绍面向对象 找来找去 发现什么都可以是面向对象 什么又都不是面向对象 后来我发现 人类认识社会的方式更多的就是面向对象的方式 物以类聚 人以群分 这句话好像给我们的面向对象有很好的诠释 会飞的
  • 【Unity】运行时创建曲线(贝塞尔的运用)

    Unity 运行时创建线 贝塞尔的运用 1 实现的目标 在运行状态下创建一条可以使用贝塞尔方法实时编辑的网格曲线 2 原理介绍 2 1 曲线的创建 unity建立网格曲线可以参考 Unity程序化网格体 的实现方法 主要分为顶点 三角面 U
  • BMS开发之面向对象思想(adbms1818)

    借鉴adbms1818的底层驱动代码 前言 adbms1818的主要用途就是不同种类的寄存器里面存储不同的数据 程序员需要通过特定的协议往寄存器里面写入或者读出数据 1 定义一个结构体 里面存储了adbms1818的所有寄存器的信息 然后我
  • BMS开发之面向对象思想(adbms1818)

    借鉴adbms1818的底层驱动代码 前言 adbms1818的主要用途就是不同种类的寄存器里面存储不同的数据 程序员需要通过特定的协议往寄存器里面写入或者读出数据 1 定义一个结构体 里面存储了adbms1818的所有寄存器的信息 然后我
  • U3D游戏开发中摇杆的制作(NGUI版)

    在PC端模拟摇杆 实现控制摇杆让玩家或者物体移动 以下是完整代码 using System Collections using System Collections Generic using UnityEngine public clas
  • 游戏开发常见操作系列之敌人系统的开发一(U3D)

    在开发游戏的过程中 我们常常会出现一些敌人攻击我们玩家 并且实现掉血以及死亡的现象 敌人还会源源不断地生成 这是怎么制作的呢 接下来为大家提供方法 其中使用了NGUI 后续会更新其它方法 敬请期待 使用HUDText实现扣血时显示文本 直接

随机推荐

  • springboot获取nacos的服务列表、实例列表及修改实例、发布配置等

    1 通过java sdk的方式发布配置 官方文档说明 https nacos io zh cn docs sdk html https nacos io zh cn docs open api html 1 1构造ConfigService
  • Linux系统中环境变量的设置

    目录 业务描述 设置环境变量的方法 系统环境变量 指定用户环境变量 临时有效的环境变量 系统常用环境变量应用分析 PATH 环境变量 HOME 环境变量 HISTSIZE 环境变量 LOGNAME环境变量 SHELL环境变量 业务描述 Li
  • 【JAVA进阶】File类、字节流

    个人主页 个人主页 系列专栏 JAVASE基础 前言 目前的编程中 数据存储方式有很多种 包括但不限于 文件存储 将数据以文件的形式存储在磁盘上 可以使用文件读写操作进行数据的存取 数据库存储 将数据以表格的形式存储在数据库中 可以使用SQ
  • 黑群晖docker安装人人影视_在云主机上手动安装腾讯PAI面板

    本文关键字 云主机上装管理面板 在前面 我们介绍过lnmp sandstorm paas 还有黑群晖 docker管理面板 这些都是云OS上的面板扩展和APPSTACK扩展 分散在不同级别被实现 像群晖这种是OS和面板一体的 包括这里要介绍
  • line-height的使用

    line height 26px 表示行高为26px line height 120 表示行高为当前字体大小的120 line height 2 6em 表示行高为当前字体的2 6倍 带单位的行高都有继承性 其子元素继承的是计算值 如父元素
  • 计算机盲打最快要多久,电脑打字怎样做到又快又准确

    除了熟悉26个字母 我们还要熟悉键盘 熟悉键盘是根本 可以下载个金山打字通练习下很快就上手了 而本文笔者着重给大家讲解下可以帮助自己快速输入的技巧 还是要利用工具的 我们聊天的时候 有的词语如果是你常用到的 而这个词又有点长 不是成语类的
  • ctfshow-网络迷踪-新手上路 ( 使用百度搜图收集景点信息)

    ctf show 网络迷踪模块第1关 只有一座桥的图片 拿到桥的名字即可 推荐使用百度搜图 先把图片下载到本地 使用百度搜图收集图片中的景点信息 根据搜图的结果可以发现 图片的来源均指向同一个地方 三亚蜈支洲岛 接下来 百度搜索 三亚蜈支洲
  • 死锁的讲解

    目录 1 死锁定义 2 死锁产生原因 3 如何解决死锁问题 1 死锁定义 死锁是指两个或两个以上的进程在执 过程中 由于竞争资源或者由于彼此通信 造成的 种阻塞的现象 若 外 作 它们都将 法推进下去 也就是两个线程拥有锁的情况下 在尝试获
  • 六、可解释性分析(Datawhale组队学习)

    文章目录 前言 理论简介 CAM算法 Lime算法 DFF算法 代码实战 torch cam工具包实战 pytorch gradcam工具包实战 captum工具包实战 shap工具包实战 lime工具包实战 总结 参考资料 本文内容为 同
  • alter table语法

    文档地址 http docs oracle com cd B19306 01 server 102 b14200 statements 3001 htm CIHCFDDJ ALTER TABLE Purpose Use the ALTER
  • shell脚本中的多行注释

    shell 中注释的使用方法 1 单行注释 单行注释最为常见 它是通过一个 来实现的 注意shell脚本的最开始部分 bin bash 的 号不是用来注释的 2 多行注释 在shell脚本中还有一种多行的注释方法 我们称之为 HERE DO
  • 机器视觉毕业设计 深度学习人体跌倒检测系统 - opencv python

    文章目录 0 前言 课题背景和意义 1 实现方法 传统机器视觉算法 基于机器学习的跌倒检测 SVM简介 SVM跌倒检测原理 算法流程 算法效果 深度学习跌倒检测 最终效果 网络原理 最后 0 前言 这两年开始毕业设计和毕业答辩的要求和难度不
  • 解决:报错cv2.error: OpenCV(4.1.2) error: (-215:Assertion failed) !_img.empty() in function ‘cv::imwrite‘

    cv2 error OpenCV 4 1 2 C projects opencv python opencv modules imgcodecs src l oadsave cpp 715 error 215 Assertion faile
  • 常见线性滤波(第一篇博客)

    一 基本概念了解 1 什么是图像滤波 官方解释 图像滤波 即在尽量保留图像细节特征的条件下对目标图像的噪声进行抑制 是图像预处理中不可缺少的操作 其处理效果的好坏将直接影响到后续图像处理和分析的有效性和可靠性 个人理解 为图像滤波是通过设计
  • Kubernetes 101,第二部分,pod

    在上一篇文章中 我们了解了Kubernetes 的基础知识以及对其主要架构的介绍 介绍完毕后 就该探索如何在 Kubernetes 中运行应用程序了 容器包装器 在 Kubernetes 中 我们无法直接创建单个容器 相反 为了更好 我们可
  • 加工中心G76,G87,G83,G84数控代码讲解

    G76表示精密镗孔循环 具体使用格式如下面 G76 X Y Z R Q F
  • Linux Shell脚本字符串变量拼接与赋值总结

    Linux Shell脚本字符串总结 1 字符串拼接 2 定义值为双引号或单引号的字符串 3 在单引号和双引号字符串中取变量值 最近在工作用到shell脚本 用到了字符串变量的拼接 同时需要对字符串进行赋值 这里与大家分享一下 1 字符串拼
  • Android进阶知识树——应用进程的启动过程

    程序的启动是从进程启动开始的 换句话说只有程序进程启动后 程序才会加载和执行 在AMS启动程序时首先会判断当前进程是否启动 对未启动的进程会发送请求 Zygote在收到请求后创建新的进程 1 Zygote监听客户端请求 由Android进阶
  • 猿创征文|Java开发工具,从环境到开发,一篇管够!

    文章目录 一 文章背景 二 环境 开发工具 1 安装Docker 2 配置 Docker 阿里镜像加速器 3 使用docker运行Mysql 8 4 使用Docker运行Redis 5 数据库管理工具 6 接口测试工具 7 代码版本管理工具
  • Unity触控——单指、双指、Windows大屏多人触控

    前段时间做了个Windows系统的大屏触控程序 最多同时支持十点触控 并且在各自的小窗口中要分别处理 即每个小窗口中的触点为一个处理组 判断其单点或多点操作 按以往移动端程序的触屏事件Input GetTouch int index 不满足