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中触摸和鼠标操作的几个问题 的相关文章

  • 拖动时获取触摸位置

    我有一些我喜欢拖来拖去的观点 意见范围内 LinearLayout 它本身位于滚动视图内 我想获取当前手指 触摸 的位置 以 在我的滚动视图上平滑滚动 具体取决于 当前拖动的高度 长按后我开始拖动 查看内置监听器startDrag view
  • 移动/触摸屏幕 - 滑动时水平滚动

    这个问题是在详细讨论后提出的这个问题 https stackoverflow com q 11649405 226906 Problem 我需要一个水平滚动 可以使用桌面上的鼠标拖动和启用触摸的屏幕上的滑动事件来滚动 可能的解决方案 我尝试
  • -webkit-overflow-scrolling touch 不适用于固定元素

    我使用一个额外的样式表 其中包含以下内容来触摸设备 touch overflow x hidden overflow y scroll webkit overflow scrolling touch body overflow x hidd
  • 离子框架中的滑动指令?

    ionic 有滑动或其他事件的指令吗 我找到了这项服务 ionicGesture 我应该用这个制定自己的指令吗 或者我应该使用其他东西 比如 ngTouch 当这个问题活跃时 似乎滑动指令不存在 但它们现在可用 http ionicfram
  • iOS touchstart 和 touchmove 之间有延迟吗?

    我正在尝试将我的网络应用程序转换为移动设备可用的形式 我正在尝试建立对水平滚动等触摸手势的支持 我在我的应用程序中发现一些奇怪的行为 我通过 touchstart 事件启动手势 然后在 touchmove 上滚动 但是 我的应用程序在接收这
  • Blackberry Storm 模拟器 - TouchGesture 事件未触发,如何让滑动功能正常工作?

    我一直在玩 Storm Emulator 和 4 7 JDE 我一生都不知道如何在模拟器中触发手势事件 下面是 RIM 示例应用程序 EmbeddedMapDemo 的触摸事件代码 这看起来很简单 但 touchGesture getEve
  • 触摸事件处理程序覆盖点击处理程序

    我正在 AngularJS 中创建一个自定义的可拖动指令 它是 jQuery 事件和普通 JavaScript 的组合 我试图使其尽可能通用和可重复使用 而且它还必须是触摸友好的 TL DR 我无法在触摸环境中单击可拖动指令上的按钮 重现步
  • 触摸浏览器中的元素(如指针事件:无)

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

    当触摸被取消时 如何让处理程序运行 例如 我可以取消突出显示按钮当 CSS 不能帮我做这件事时 https stackoverflow com questions 74843213 chrome mobile javascript even
  • 将 UIGesture 转发到后面的视图

    我正在开发 iPhone iOS 4 0 或更高版本 应用程序 并且在多个视图之间进行触摸处理时遇到一些问题 我有这样的视图结构 gt A superView gt SubView A gt SubView B exactly on top
  • 是否可以使用触控板进行手势操作?

    在 Chrome 中的 Macbook Pro 上 在屏幕上滑动两根手指可以前后移动 我该如何禁用此功能 并在 jQuery 或 Javascript 中创建自定义手势 我真正需要知道的是当两个手指放在触控板上时如何检测 我认为这是最好的方
  • javascript 检测桌面触摸和鼠标支持

    触控设备应如何区分纯触控设备和带有鼠标的设备 就像今天的一些笔记本电脑 需要在应用程序中给予所有鼠标功能优先级 并且如果运行应用程序的设备仅支持触摸 则需要更改功能 如果触摸设备也有鼠标指针 逻辑建议应用程序应将该设备视为普通桌面 并且也可
  • 在 Windows 设备中捕获屏幕上的触摸输入

    有什么方法可以捕获 Windows 设备中屏幕 应用程序框架之外 上的触摸输入 我正在开发 WPF 应用程序 并且可以检索仅发生在应用程序框架内的触摸输入 另外 有没有办法即使在应用程序最小化时也可以注册触摸输入 WPF 框架没有内置方法可
  • 是否可以在越狱的ios上使用外部键盘模拟触摸事件?

    是否可以在 iOS 越狱以及越狱涉及的所有元素上模拟特定屏幕坐标中的触摸事件 按下物理外部键盘 通过相机连接套件或蓝牙的 USB 上的特定按键 我会用它来用脚按下应用程序 振幅 中的按钮 我想使用键盘作为脚踏开关 仅供私人使用 没有应用商店
  • Android 屏幕上的触摸事件

    我想找出当用户触摸 Android 的任何屏幕时发生的任何事件 我发现特定活动的触摸事件 但不是所有屏幕 请给我一个 解决方案 试试这个代码 Override public boolean onTouchEvent MotionEvent
  • 通过鼠标和触摸在画布上绘图

    我想在画布上绘图 使用鼠标效果很好 但我必须如何修改代码才能使其在 iPad 或 Nexus 上运行 link http jsfiddle net FgNQk 6 var canvas document getElementById can
  • UIButton突出显示区域延伸到按钮之外

    当用户触摸 UIButton 时 应启动突出显示状态 当他将手指滑到按钮之外 仍然没有抬起手指 时 按钮突出显示应该停止 并且当他抬起手指时 不应触发按钮 这种行为正是 iOS 的工作原理 但我对仍然应用突出显示的有效区域感到有点惊讶 对于
  • 如果 UIGestureRecognizer 触发,如何取消按钮点击?

    更新 问题似乎是对另一个 GestureRecognizer 的依赖失败 请参阅此问题下面的评论和测试项目 在我的 iPhone 应用程序中 我有一个包含多个 UIButtons 作为子视图的视图 该视图还有一个 UITapGestureR
  • Meteor 中的触摸事件

    我开始使用 Meteor 做的第一件事是开始为手机 平板电脑编写基于触摸的 Web 应用程序 以下是重现问题的方法 第一步 创建一个空白项目 meteor create touch example cd touch example mete
  • 自上次触摸起 60 秒后开始 ViewFlipper 翻转

    我的应用程序包含一个ViewFlipper与一些图像 当应用程序启动时 ViewFlipper startflipping 当用户触摸屏幕时ViewFlipper stopflipping 我必须在上次触摸后 60 秒后执行此操作 View

随机推荐

  • 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