Unity如何实现触摸和鼠标操作的几个问题

2023-10-27

**关键点1:**在unity中touch事件同时也会触发GetMouseButton事件,有时候可能会给你带来方便,但是如果没有意识到这个问题的话,也很可能给你带来很大的麻烦。

**关键点2:**触摸操作也可以使用Input.GetAxis(“MouseX”)(或"MouseY",下同,略去不写)来判断指尖移动的距离,虽然这点很方便,但是这样就带来了另外两个问题,见关键点3和4;

**关键点3:**Input.GetAxis(“MouseX”)取得的值与Input.GetTouch(0).deltaPosition的取值有一些细微但是很重要的差别:

    1)==**如果使用鼠标操作**==,那么Input.GetAxis对鼠标移动的取值方式表现的很正常,因为不管是否点击,鼠标始终存在,鼠标位置始终能够正常获取,Input.GetAxis("MouseX")原本是为鼠标设计的,取值方式是连续的;使用Input.GetTouch(0).deltaPosition无效,因为没有触摸操作;

    2)==**如果使用触摸操作**==,再细分两种情形:

              a. 如果使用if(Input.GetMouseButton(0))来作为判断是否按下的条件:

那么使用Input.GetAxis来获取手指的移动就需要注意了,触摸的手指是可以离开屏幕的,一旦手指离开屏幕,GetAxis(“MouseX”)就不知所措了,只好记住离开前的手指位置,下一次手指再接触的时候和这个位置对比(个人猜测GetAxis(“MouseX”)是对比鼠标/触摸点位置的方法来取得的)。例如手指从屏幕的左边拿开,然后再触摸屏幕的右边,那么取得的x位置会是一个很大的正值。这就是个很大的问题,这个问题是GetMouseButton和GetAxis在使用手指触摸的情况下配合上的不默契产生的。但是使用Input.GetTouch(0).deltaPosition就不会有这种现象,个人猜测可能是因为deltaPosition是测量每一帧内的移动距离的方法吧。

              b. 如果使用if(Input.touchCount>0&&Input.GetTouch(0).phase== TouchPhased.Moved)来做为判断是否按下的条件:

使用Input.GetAxis(“Mouse X”),没有任何问题;

使用deltaPosition同样没有任何问题,因为这就是为触摸操作而设计的。

关键点4:实践中发现在直观感觉差不多的滑动过程(分别用鼠标拖动和手指拖动)中,Input.GetTouch(0).deltaPosition.x的值总是比Input.GetAxis(“Mouse X”)取得的值要大很多,分析可能是手机屏幕dpi比较大的原因,因此在实践中为了获取直观感受差不多的旋转速度,要分别调试旋转加成系数。

总结一下:不要使用一条代码判断两种情况,最好分开,做一个单选(可以使用Enum),要么鼠标操作,要么触摸操作,分别使用最合适的判断和函数,并分别调试旋转加成系数

事件回顾:

在写一个惯性拖动旋转的脚本的时候,为在pc和Android平台上都能使用(即用鼠标和触摸都能控制),我使用了如下的判断语句:

if(Input.GetMouseButton(0) || (Input.touchCount>0&& Input.GetTouch(0).phase == TouchPhase.Moved)

来判断鼠标按下或者手指按下,并用Input.GetAxis(“MouseX”)来获取拖动的值,期望能够一次判断两种情况,分别适应不同平台的操作。在pc上使用鼠标操作没有任何问题,但是在android上触摸操作时出现了问题。经过多次测试并查阅资料,发现原来触摸操作也可以触发Input.GetMouseButton(0)的事件,这就引发了前述关键点3>2)>a 中的问题。

惯性旋转物体脚本:
 
usingUnityEngine;
 
usingSystem.Collections;
 
//操作方式
 
public enumControlType{
 
mouseControl,
 
touchControl,
 
}
 
public classRotateTarget: MonoBehaviour
 
{
 
publicControlType controlType;
 
   public Transform rotTarget;
 
 
//旋转速度加成系数
 
   public float rotSpeedScalar;
 
   private float currentSpeed = 0;
 
 
   void Update()
 
   {
 
       if(controlType==ControlType.mouseControl)
 
      {
 
          //鼠标操作
 
          if(Input.GetMouseButton(0))
 
          {
 
                //拖动时速度
 
  //鼠标或手指在该帧移动的距离*deltaTime为手指移动的速度,此处为Input.GetAxis("MouseX") / Time.deltaTime
 
  //不通帧率下lerp的第三个参数(即混合比例)也应根据帧率而不同--
 
  //考虑每秒2帧和每秒100帧的情况,如果此参数为固定值,那么在2帧的情况下,一秒后达到目标速度的0.75,而100帧的情况下,一秒后则基本约等于目标速度
 
                currentSpeed = Mathf.Lerp(currentSpeed, Input.GetAxis("Mouse X") /Time.deltaTime,0.5f*Time.deltaTime);
 
          } else
 
          {
 
             //放开时速度
 
             currentSpeed = Mathf.Lerp(currentSpeed, 0,0.5f*Time.deltaTime);
 
          }
 
      }
 
elseif(controlType==ControlType.touchControl)
 
      {
 
          //触摸操作
 
          if (Input.touchCount > 0&& Input.GetTouch(0).phase == TouchPhase.Moved)
 
          {
 
//在安卓设备上也可以用MouseX,根据实验,touch[0].deltaPosition.x的值总是比Mouse X的值大很多,所以此处使用MouseX
 
currentSpeed= Mathf.Lerp(currentSpeed, Input.GetAxis("MouseX")/Time.deltaTime,0.5f*Time.deltaTime);
 
          } else
 
          {
 
             //放开时速度
 
             currentSpeed = Mathf.Lerp(currentSpeed, 0,0.5f*Time.deltaTime);
 
          }
 
      }
 
      rotTarget.Rotate(Vector3.down, Time.deltaTime * currentSpeed *rotSpeedScalar);
 
   }
 
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Unity如何实现触摸和鼠标操作的几个问题 的相关文章

  • Flutter屏幕适配

    文章目录 Flutter屏幕适配 一 Flutter中的单位 1 1 点 points 1 2 像素 pixels 1 3 设备像素比 devicePixelRatio 二 适配方案 2 1 rpx 适配 2 2 flutter scree
  • KEIL5使用技巧

    目录 1 文本美化 2 代码编辑技巧 1 TAB 键的妙用 2 快速位函数 变量被定义的地方 3 快速注释与快速消注释 3 其他小技巧 下面 向大家介绍KEIL5 软件的一些使用技巧 这些技巧在代码编辑和编写方面会非常有用 1 文本美化 文
  • NGSIM数据集处理-添加标签、特征标准化

    添加标签 对向左向右换道数据添加不同的标签 usr bin env python coding utf 8 In 1 import csv import pandas as pd f2 pd read csv CL train41 csv
  • django设置models.Model数据可以为空

    添加设置 null True blank True 比如 size models CharField max length 255 default null True blank True
  • 华为OD机试 - 分苹果 - 二进制(Java 2023 B卷 100分)

    目录 专栏导读 一 题目描述 二 输入描述 三 输出描述 四 解题思路 五 Java算法源码 六 效果展示 1 输入 2 输出 3 说明 核心算法 按照二进制加法计算 并且不计算进位 但是 B希望在满足A的情况下获取苹果重量最多 华为OD机
  • 神州云服务平台(型号:DCC-CRL1000)基本配置教学视频

    教学视频只提供网络搭建与应用技能大赛第二部分基本配置部分视频 仅供大家学习使用 2021年全国职业院校网络搭建及应用第二部分基本配置视频 由于在线播放视频有点模糊 所以给大家提供清晰的教学视频下载链接 神州云服务平台 型号 DCC CRL1
  • 教你如何看懂EMC空间辐射测试报告

    空间辐射测试是最常做的EMC电磁兼容测试项目之一 也是最容易出现问题的一个测试项目 对很多刚接触EMC的朋友来讲 拿到EMC的测试数据 往往感觉比较陌生 不知道怎么看这份数据 相信看完以下内容 你就不会陌生了 专业测试辐射的场所是屏蔽室 主
  • 单片机开发入坑指南

    入坑前了解 什么是单片机 单片机英文名Microcontrollers 即微控制器 英文简称MCU 单片机是一种集成电路芯片 是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU 随机存储器RAM 只读存储器ROM 多种I O口和
  • 第十讲:神州三层交换机配置单区域OSPF路由协议

    关于OSPF 其中的几个基本概念需要了解 OSPF是开放式最短路径优先的缩写 OSPF的协议号是89 OSPF协议中的Router ID是一台路由器的唯一标识 在整个白治系统中唯一 Router ID从路由器的接口lP地址中选择出来 选择的
  • win10从控制台直接进入Anaconda Prompt环境

  • Uboot 编译失败问题

    编译失败问题汇总 索引 一 已经有uboot源码 并且有 build sh 的情况 一 已经有uboot源码 并且有 build sh 的情况 首先Makefile 没有配置编译器 导致的错误 错误提示信息如下 cc1 error bad
  • day27

    1 网络编程 a 软件 客户端 CS架构 client gt server 浏览器 BS架构 browser gt server b 如何实现相互通信 需求一 编写两个软件 软件之间相互通信 需求二 两个人直接连接 网线 需求三 教室相互通
  • 洛谷P1023 税收与补贴问题

    题目描述 你是某家咨询公司的项目经理 现在你已经知道政府对某种商品的预期价格 以及在各种价位上的销售情况 要求你确定政府对此商品是应收税还是补贴的最少金额 也为整数 才能使商家在这样一种政府预期的价格上 获取相对其他价位上的最大总利润 总利
  • Win10+RTX3060配置CUDA等深度学习环境

    Win10 RTX3060机器学习环境配置 1 下载准备 2 下载安装CUDA和CUDNN 2 1 cuda和cudnn下载 2 2 cuda和cudnn安装 3 安装GPU版pytorch与TensorFlow 3 1 下载 3 2 安装
  • synchronized修饰static方法与非static方法的区别

    当synchronized修饰一个static方法时 多线程下 获取的是类锁 即Class本身 注意 不是实例 作用范围是整个静态方法 作用的对象是这个类的所有对象 当synchronized修饰一个非static方法时 多线程下 获取的是
  • iOS第三方支付集成-支付宝支付

    吐槽一下支付宝的文档和demo 文档真是找的我眼花缭乱 demo写的也是看的捉急 没有微信的简单明了 不过全部找到后 静下心来研究 也还是可以的 一 进入官方下Demo 看文档 工欲善其事必先利其器 先看下demo总不是坏处 也可以学习一下
  • 《Spark大数据技术与应用》肖芳 张良均著——课后习题

    目录 教材 知识汇总 课后习题 第一章 Spark概述 Spark的特点 Spark生态圈 Spark应用场景 第二章 Scala基础 匿名函数 Set Map map flatMap groupBy 课后习题 第三章 Spark编程 教材
  • Unity mlagent中强化学习ppo算法的参数怎么设置?

    Unity ML Agents的PPO算法参数可以通过设置ML Agents的Hyperparameter设置来调整 具体有 batch size discount gae lambda learning rate entropy coef
  • 2022尚硅谷阳哥docker篇之Portainer的监控三剑客

    docker compose yml文件 version 3 1 volumes grafana data services influxdb image tutum influxdb 0 9 restart always environm

随机推荐

  • 戴尔,更换固态硬盘后no bootable devices found

    注意 操作之前要备份 备份 备份 更换固态硬盘后 出现no bootable devices found 可以尝试一下这个方法 https www zhihu com question 299594649 answer 1565769605
  • 机器人学:(1)机器人基础

    1 1 机器人机构 机器人的机械机构由一系列刚性构件 连杆 通过链接 关节 联结起来 机械臂的特征在于具有用于保证可移动性的臂 arm 提供灵活性的腕 wrist 和执行机器人所需完成任务的末端执行器 end effector 机器人分为串
  • TS:etcd集群某个etcd实例启动报错(报cluster ID mismatch)-2022.10.13(已解决)

    目录 文章目录 目录 1 报错现象 2 排查过程 3 解决过程 1 尝试办法1 2 尝试办法2 4 总结 引用 关于我 最后 1 报错现象 在k8s高可用集群搭建过程中 关于etcd集群搭建是 报错了 自己当时环境如下 本次复用3个node
  • Java基础题

    面向对象程序设计期末复习之手写代码 Java编程基础 1 定义一个整型的长度为6的一维数组k 6 并将数组中元素k i 值初始化为i 然后 将元素k 3 打印出来 class test1 public static void main St
  • ISIS简介、NSAP与NET地址、Router-Id转换成NET地址

    2 0 0 ISIS简介 NSAP与NET地址 Router Id转换成NET地址 ISIS简介 IS IS Intermediate System to Intermediate System 中间系统到中间系统 1 该协议最初是ISO国
  • 逆向思维:卡通照片真人化

    之前PaddleGAN的趣味应用如雨后春笋般地出现 非常多的项目都是xxx动漫化 当时就有一个很普通的想法为什么大家都会去搞动漫化 这很可能是因为二次元文化的原因 又或者是动漫化的应用 商业价值 就突然蹦出一个想法 为什么没人弄动漫真人化呢
  • free vs delete简洁版

    free释放的是指针指向的内存 回归到操作系统的空闲内存链表中 之后还需要程序员手动将对应的指针赋值成为NULL 不然那个指针还在 并且还指向那个内存 delete是调用的是对应的new 的变量的析构函数 delete对应new delet
  • 出现 Request Entity Too Large问题的解决方法

    根据经验判断应该是上传文件大小被限制了 检查了应用配置是10M 把它设置成100M 重启服务也不能解决问题 原来我们的tomcat是通过nginx发现服务代理的 问题就出现nginx服务器上 原来nginx默认长传文件的大小是1M 可在ng
  • VMware安装系统时“无法创建新虚拟机: 不具备执行此操作的权限“的解决方案

    VMware安装系统时 无法创建新虚拟机 不具备执行此操作的权限 的解决方案 参考文章 1 VMware安装系统时 无法创建新虚拟机 不具备执行此操作的权限 的解决方案 2 https www cnblogs com kailugaji p
  • Python_爬虫复习_爬取直播间弹幕生成词云图

    爬取直播间弹幕 生成词云图 一 环境准备 安装相关第三方库 pip install jieba pip install wordcloud 二 数据准备 爬取对象 2021年5月23号 RNG夺冠直播间的弹幕信息 爬取对象路径 方式1 根据
  • 使用淘宝npm源安装electron7.x.x版本报错的问题

    windows 与 linux 一样 修改用户目录下 npmrc 文件 registry https registry npm taobao org sass binary site https npm taobao org mirrors
  • Unity Animation动画循环播放时卡顿、不连贯问题解决办法

    一 动画卡顿 如上图 可看到 当循环播放动画时 动画像瘸了似的 一会块 一会慢 总之就是不连贯 二 解决办法 打开该元素对应的Animation 然后选中下方的Curves动画曲线 在这里我们可以看到 该动画是一条S型曲线 故而播放速度才会
  • vs2019+pcl1.10.1一劳永逸配置

    不同pcl版本的安装配置有微小差异 低版本要稍微复杂一点 建议选择跟博客一样的配置 防止奇奇怪怪的错误 本次配置是windows vs2019 pcl1 10 1 1 下载pcl1 10 1 Release pcl 1 10 1 Point
  • Nacos Config远程配置读取失败

    项目场景 测试Springboot整合RabbitMQ的时候 使用Nacos做远程配置中心 问题描述 使用Nacos做远程配置中心 在bootstrap yml中已经配置好相关信息如下 spring application name rab
  • C语言三级指针

    C语言 三级指针的应用 http www cnblogs com zhanggaofeng p 5498218 html 三级指针的应用场景 https blog 51cto com wait0804 1874777 三级指针四级存储空间的
  • Android Studio 点击按钮跳转到另一个Activity

    there 一 前言 二 前置工作 2 1创建新的界面和按钮 2 2 绑定按钮 三 intent进行连接并跳转 四 总结 一 前言 最近才开始使用Android Studio 不太熟悉 用博客记录一下 二 前置工作 2 1创建新的界面和按钮
  • python的全局解释锁(GIL)

    一 介绍 全局解释锁 Global Interpreter Lock GIL 是在某些编程语言的解释器中使用的一种机制 在Python中 GIL是为了保证解释器线程安全而引入的 GIL的作用是在解释器的执行过程中 确保同一时间只有一个线程可
  • 集合中常用方法的使用

    集合中常用方法的使用 文章目录 数组和List之间的转化 数组转化为List List转化为数组 包装类型的数据转化 list gt array 注 只能转化到包装类 array gt list 注 只能用包装类转化 数组基本类型和包装类之
  • c++字符型变量和字符串型变量

    include
  • Unity如何实现触摸和鼠标操作的几个问题

    关键点1 在unity中touch事件同时也会触发GetMouseButton事件 有时候可能会给你带来方便 但是如果没有意识到这个问题的话 也很可能给你带来很大的麻烦 关键点2 触摸操作也可以使用Input GetAxis MouseX