Unity中触摸和鼠标操作的几个问题

2023-11-08

关键点1:

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

关键点2:

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

关键点3:

Input.GetAxis(“Mouse X”)取得的值与Input.GetTouch(0).deltaPosition的取值有一些细微但是很重要的差别:

  1. 如果使用鼠标操作,那么Input.GetAxis对鼠标移动的取值方式表现的很正常,因为不管是否点击,鼠标始终存在,鼠标位置始终能够正常获取,Input.GetAxis(“Mouse X”)原本是为鼠标设计的,取值方式是连续的;使用Input.GetTouch(0).deltaPosition无效,因为没有触摸操作;
  2. 如果使用触摸操作,再细分两种情形:

    1. 如果使用if(Input.GetMouseButton(0))来作为判断是否按下的条件:
      那么使用Input.GetAxis来获取手指的移动就需要注意了,触摸的手指是可以离开屏幕的,一旦手指离开屏幕,GetAxis(“Mouse X”)就不知所措了,只好记住离开前的手指位置,下一次手指再接触的时候和这个位置对比(个人猜测GetAxis(“Mouse X”)是对比鼠标/触摸点位置的方法来取得的)。例如手指从屏幕的左边拿开,然后再触摸屏幕的右边,那么取得的x位置会是一个很大的正值。这就是个很大的问题,这个问题是GetMouseButton和GetAxis在使用手指触摸的情况下配合上的不默契产生的。但是使用Input.GetTouch(0).deltaPosition就不会有这种现象,个人猜测可能是因为deltaPosition是测量每一帧内的移动距离的方法吧。
    2. 如果使用 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(“Mouse X”)来获取拖动的值,期望能够一次判断两种情况,分别适应不同平台的操作。在pc上使用鼠标操作没有任何问题,但是在android上触摸操作时出现了问题。经过多次测试并查阅资料,发现原来触摸操作也可以触发Input.GetMouseButton(0)的事件,这就引发了前述 关键点3第二条第一项中的问题。

附:惯性旋转物体脚本:

using UnityEngine;
using System.Collections;
//操作方式
public enum ControlType{
mouseControl,
touchControl,
}
public class RotateTarget: MonoBehaviour
{
public ControlType controlType;
    public Transform rotTarget;

//旋转速度加成系数
    public float rotSpeedScalar;
    private float currentSpeed = 0;

    void Update()
    {
        if (controlType==ControlType.mouseControl)
        {
            //鼠标操作
            if (Input.GetMouseButton(0))
            {
                    //拖动时速度
   //鼠标或手指在该帧移动的距离*deltaTime为手指移动的速度,此处为Input.GetAxis("Mouse X") / 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);
            }
        }
else if(controlType==ControlType.touchControl)
        {
            //触摸操作
            if (Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Moved)
            {
//在安卓设备上也可以用Mouse X,根据实验,touch[0].deltaPosition.x的值总是比Mouse X的值大很多,所以此处使用Mouse X
currentSpeed = Mathf.Lerp(currentSpeed, Input.GetAxis("Mouse X")/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中触摸和鼠标操作的几个问题 的相关文章

  • 可靠地检测用户是否在网页上使用鼠标?

    在我们的页面上 我们有一些长水平滚动的 iframe div 如果用户使用鼠标 他们可以使用滚动条滚动 我们希望他们能够选择 iframe 中的文本 但是 如果他们仅使用触摸 则滚动条会很麻烦 我想在整个事物上覆盖一个透明元素 以使他们能够
  • iOS touchstart 和 touchmove 之间有延迟吗?

    我正在尝试将我的网络应用程序转换为移动设备可用的形式 我正在尝试建立对水平滚动等触摸手势的支持 我在我的应用程序中发现一些奇怪的行为 我通过 touchstart 事件启动手势 然后在 touchmove 上滚动 但是 我的应用程序在接收这
  • 在 iOS 11 PDFKit 文档上实现墨迹注释

    我想允许用户在 PDFView 中查看的 iOS 11 PDFKit 文档上绘图 绘图最终应嵌入到 PDF 中 我通过向 PDFPage 添加 ink 类型的 PDFAnnotation 以及与用户绘图相对应的 UIBezierPath 来
  • 触摸浏览器中的元素(如指针事件:无)

    问题 我搜索了又搜索 但找不到有关如何通过覆盖元素触发触摸事件的信息 我通过使用以下方法解决了鼠标单击事件的问题 pointer events none 这很简单 但它不适用于触摸事件 我知道有一些移动原生的东西可以解决这个问题 但这纯粹是
  • 触摸时 ACTION_CANCEL

    我有以下类 它代表一个可触摸的视图并绘制一个滑动条 public class SlideBar extends View private int progress private int max private Paint backgrou
  • WPF 是否有按住手势?

    WPF 是否有按住手势 我找不到相关的事件 所以我尝试为自己实现一个 我知道有Stylus类但在 WPF 中它对我没有帮助 如果没有 那就是我的代码 using System using System Collections Generic
  • 了解触摸事件

    我正在尝试让我的一些库与触摸设备一起使用 但我很难弄清楚它们是如何支持的以及它们是如何工作的 基本上有5个触摸事件 https developer mozilla org en US docs DOM Touch events 但移动浏览器
  • 在 Windows 设备中捕获屏幕上的触摸输入

    有什么方法可以捕获 Windows 设备中屏幕 应用程序框架之外 上的触摸输入 我正在开发 WPF 应用程序 并且可以检索仅发生在应用程序框架内的触摸输入 另外 有没有办法即使在应用程序最小化时也可以注册触摸输入 WPF 框架没有内置方法可
  • 如何以编程方式检查、获取和设置 Android 手机中的触摸设置?

    是否可以通过编程方式获取 Android 中的各种触摸设置 例如 gt 拨号盘按键音 gt 触摸声音 gt 屏幕锁定声音 gt 触摸时振动 我尝试访问 System Settings 中的各种常量 但我没有看到任何提及触摸设置的常量 任何人
  • 将点击事件与 Twitter Bootstrap 结合使用

    我正在使用 twitter bootstrap 开发一个可以在多个设备上呈现的 Web 应用程序 现在我想处理 点击 事件 所以我的问题是 我可以使用 jquery 1 7 2 处理 tap 事件而不使用 jquery Mobile 吗 如
  • 用Java模拟触摸命令

    我想更改二进制文件的修改时间戳 这样做的最佳方法是什么 打开和关闭文件是一个不错的选择吗 我需要一个解决方案 其中时间戳的修改将在每个平台和 JVM 上更改 文件类有一个设置最后修改时间 http docs oracle com javas
  • 如何检测哪个SKSpriteNode已被触摸

    我找到一个类似的问题 https stackoverflow com questions 27922198 how do i detect if an skspritenode has been touched 但我试图检测并识别用户触摸的
  • WPF 无法从 MouseDown 事件获取触摸位置

    我有一个 WPF 项目是在 NET v 4 0 添加触摸支持之前编写的 因此仅处理鼠标事件 我在用手指在触摸屏上测试项目时遇到了这个问题 问题是 位置 X Y 在第一次触摸中被正确检索 但 X Y 值在后续触摸中保持不变 无论我触摸哪里 即
  • 仅 CSS 下拉菜单不像 iPad 等。跟随菜单链接而不显示菜单

    我们在这里创建了一个新网站 www worthingleisure co uk splashpoint 它的顶部有一个纯 CSS 菜单 通过使用 li hover ul 方法并适当显示和隐藏 该菜单应该适用于 iPad iPhone 和其他
  • 创建面向鼠标和触摸的 WPF 应用程序的最佳实践[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 检查 touchend 是否在拖动后出现

    我有一些代码可以更改表的类 在手机上 有时表格对于屏幕来说太宽 用户将拖动 滚动来查看内容 但是 当他们触摸并拖动表格时 每次拖动都会触发 touchend 如何测试触摸端是否是触摸拖动的结果 我尝试跟踪dragstart和dragend
  • 如何在 Chrome 中创建 TouchEvent?

    The W3C规范 http www w3 org TR 2011 WD touch events 20110505 idl def TouchEvent宣称initTouchEvent如下 void initTouchEvent in D
  • 移动物体而不实际接触物体

    我是 iPhone 开发的初学者 我一直在寻找这个问题的答案 但还没有找到任何东西 我想做的是允许用户移动对象而无需实际触摸该对象 他们可以触摸屏幕上的任何位置 并且当他们移动时 对象将从原来的位置向用户的方向移动移动但不会跳到他们的触摸位
  • 如何检测 Android 上的触摸输入

    现在我想做的就是检测何时按下屏幕 然后显示一条日志消息以确认它发生了 到目前为止 我的代码是根据 CameraPreview 示例代码修改的 它最终会拍摄一张照片 因此大部分代码位于扩展 SurfaceView 的类中 SDK 中示例代码的
  • 缩放网页内容上的特定元素(HTML、CSS、JavaScript)

    如果用户在移动设备上缩放网站 我只想缩放网站的特定元素 某个 div 下图展示了我的想法 如您所见 测试已缩放 但顶部 div 保持相同大小 仅包含 test 的 div 被缩放 缩放 有人可以给我一些关于如何实现这一目标的提示吗 我真的不

随机推荐

  • Python3 TypeError: Required argument ‘outImg‘ (pos 3) not found

    问题 在用python3使用img3 cv2 drawMatchesKnn img1 kp1 img2 kp2 good flags 2 的时候 可能会产生错误 TypeError Required argument outImg pos
  • solidity 安全 合约的短地址攻击——这个锅谁来背

    前一段时间 有个用户用说发交易的时候提示地址错误 后来发现发送的地址少了一字节 所以钱包检测发送地址时 会提示错误 当时也没当回事 以为是用户自己搞错了 最近研究solidity的时候 才明白了当时是怎么回事 原来这个用户遇到了短地址攻击
  • 超详细解释MyBatis与Spring的集成原理

    前言 最原始的MyBatis的使用 通常有如下几个步骤 读取配置文件mybatis config xml构建SqlSessionFactory 通过SqlSessionFactory拿到SqlSession 通过SqlSession拿到Ma
  • SpringCloud

    文章目录 微服务架构 SpringCloud 二 上篇SpringCloud本Cloud 1 SpringCloud的命名规则及版本关系 1 1 springboot与springcloud的版本依赖 1 2 本次博文使用的环境及版本 2
  • 浅谈NB-IOT模块调试

    背景 在物联网的口号下 我们公司也有幸踏足NB物联这块 当然也只是二次应用开发 NB核心开发技术都掌握在几个大公司大佬手里 例如 华为海思 高通 intel 当然模块 厂商又例如 移远 ublox等 芯片的资料和技术不像Lora这样开源 所
  • python实现字符串匹配算法BF,BF改,KMP

    包含 BF BF改进版本 KMP BF 暴力搜索 BF改 当判断匹配失败的字符串是不是与首字母相同 若不同 继续BF算法 若相同 直接将首字母移到当前位置 KMP 通过前缀与后缀发现待匹配字符串本身的特性 匹配失败时一次性移动多个字符以减少
  • python三维数组切片

    使用np random randint创建一个 3 4 5 的三维随机数组 利用切片返回 如下图位置的数
  • 文件上传封装与使用

    组件封装
  • Linux下Fork与Exec使用

    老邮局 琼楼挂月钓流云 梦里瑶台暂借春 Linux下Fork与Exec使用 一 引言 对于没有接触过Unix Linux操作系统的人来说 fork是最难理解的概念之一 它执行一次却返回两个值 fork函数是Unix系统最杰出的成就之一 它是
  • 白帽,黑帽,灰帽,绿帽!一文了解黑客的所有信息

    前言 您是否想过黑客有许多不同的类型 是什么因素促使他们学习黑客技能 当我想到黑客时 我都会想到下面这张图片 那就是黑客的形象 那你呢 文末有彩蛋 网络可以说是有史以来最重要的战场 这里没有国界 也没有有组织的军队 在线网络战场是善恶之间最
  • ucosII 下iic 的使用问题(含解决方式)

    今天在将SGP30气体传感器的代码移植到ucosii中使用时遇到了输出数据一直为65535的情况 分析现象 开始以为是硬件问题 元器件损坏等原因 使用了裸核代码进行测试 能够正常读取相应参数说明硬件正常 ucos跑死了 增加led显示任务
  • 机器学习笔试题一

    1 输入图片大小为200 200 依次经过一层卷积 kernel size 5 5 padding 1 stride 2 pooling kernel size 3 3 padding 0 stride 1 又一层卷积 kernel siz
  • @Autowired三种注入方式的区别以及@Inject注解的基本使用

    文章目录 Autowired三种注入方式的区别 Autowired三种注入方式 1 构造器注入 lombok注解实现构造器注入 2 setter注入 3 属性注入 问题一 问题二 总结 使用 Inject 代替 Autowired 参考 A
  • 彻底搞清楚javascript中的require、import和export

    为什么有模块概念 理想情况下 开发者只需要实现核心的业务逻辑 其他都可以加载别人已经写好的模块 但是 Javascript不是一种模块化编程语言 在es6以前 它是不支持 类 class 所以也就没有 模块 module 了 require
  • 【大模型】在linux上使用nvidia显卡,使用llam.cpp框架运行Baichuan-7B 模型,可以成功运在CPU和GPU下运行,int4量化版本速度飞快。

    1 先下载模型Baichuan 7B 找到个网站可以快速的下载模型 https aliendao cn models baichuan inc Baichuan 7B pytorch model bin 13 0 GB Baichuan 7
  • 常用jquery 方法

    注意点 使用jquer时时刻注意此时是jquery 对象 而非dom对象 在调用相关方法 属性时 注意不用与dom对象混用 导致调用失败 一 IFRAME相关调用知识 摘自 http java my life iteye com blog
  • python学习-GUI

    图形用户界面和游戏开发 一 基于tkinter模块的GUI 在python中的默认GUI开发模块是tkinter 还有其他的模块wxPython PyQt PyGTK等 基于tkinter开发的GUI应用以下5个步骤 导入tkinter模块
  • "undefined reference to" 问题解决方法

    最近在 Linux 下编程发现一个诡异的现象 就是在链接一个静态库的时候总是报错 类似下面这样的错误 text 0x13 undefined reference to func 关于undefined reference 这样的问题 大家其
  • nmap常用命令

    nmap 命令 1 nmap sT 192 168 96 4 TCP连接扫描 不安全 慢 2 nmap sS 192 168 96 4 SYN扫描 使用最频繁 安全 快 3 nmap Pn 192 168 96 4 目标机禁用ping 绕过
  • Unity中触摸和鼠标操作的几个问题

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