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

京城游戏人-Day9:Unity 中的鼠标点击与触摸屏点击 京城游戏人-Day10:Unity 中的鼠标点击与触摸屏点击- 作者:大锐哥 地址:http://blog.csdn.net/prevention -1、先说几点结论 Unity 中鼠标点击(MouseButton)与触摸点击(Touch)是分开处理的,但请注意下一条。 Unity 中鼠标点击(MouseButton)也可以响应触摸手势。 Unity 中鼠标点击的GetMouseButton包含:按 阅读详情

关键点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);

   }

}
原文地址:http://blog.sina.com.cn/s/blog_4148e8630101velz.html

“Unity 输入变得简单:触摸事件和鼠标交互指南” 触摸输入是许多移动和基于触摸屏的游戏和应用程序的一个基本方面。无论您是在创建休闲手机游戏还是 VR 体验,了解如何在 Unity 中使用触摸输入都至关重要。在本综合指南中,我们将探讨什么是触摸输入、如何使用它以及如何确定触摸的位置以及对应的游戏对象 阅读详情

相关推荐

Unity 移动端触摸屏操作

Unity 触屏操作 当将Unity游戏运行到IOS或Android设备上时,桌面系统的鼠标左键可以自动变为手机屏幕上的触屏操作,但如多点触屏等操作却是无法利用鼠标操作进行的。Unity的Input类中不仅包含桌面系统的各种输入功能,也包含了针对移动设备触屏操作的各种功能,下面介绍一下Input类在触碰操作上的使用。 首先介绍一下Input.touches结构,这是一个触摸数组,每个记录代表着

melonstreet的专栏 2万+

Unity-鼠标事件-Input.GetMouseButton等

1.GetMouseButton(): 每一帧鼠标处于按下状态 都会返回true, 2. GetMouseButtonDown(): 鼠标 按下的那一帧 返回true, 3. GetMouseButtonUp(): 鼠标 抬起的那一帧 返回true, 0表示鼠标左键, 1表示鼠标右键, 2表示鼠标中键。 ...

weixin_40722235的博客 3654

Unity 进阶 之 简单模仿鼠标交互(场景:手机屏幕当做触摸板Touch Pad,移动鼠标,鼠标确定等操作)

Unity 进阶 之 简单模仿鼠标交互(场景:手机屏幕当做触摸板Touch Pad,移动鼠标,鼠标确定等操作) 目录 Unity 进阶 之 简单模仿鼠标交互(场景:手机屏幕当做触摸板Touch Pad,移动鼠标,鼠标确定等操作) 一、简单介绍 二、实现原理 三、注意事项 四、效果预览 五、实现步骤 六、关键代码 一、简单介绍 Unity中的一些知识点整理。 本节简单介绍在Unity开发中的,因为项目的开发需要,需要把手机屏幕当做触控板,模拟鼠标移动和点击交互等,所以这里...

仙魁XAN 7053

unity 2d鼠标拖动卡牌运动,发现鼠标与物体的实际运行位置不一致

原因很可能是ngui的相机的size数值不对。

hhkun0120的专栏 2696

Unity实现隐藏鼠标功能

Unity实现隐藏鼠标功能 前言 在实际项目开发中,我们使用Unity将项目打成exe包,经常需要将鼠标隐藏掉,比如触摸屏的项目,播放视频的项目。Unity实现隐藏鼠标的功能十分简单,只需要一行代码,如下所示: 实现方法 1.实现隐藏鼠标的方法如下所示: using System.Collections; using System.Collections.Generic; using UnityEngine; public class CursorTest : MonoBehaviour { //

波波斯维奇 1万+

Unity 发布触摸webgl问题

来源https://www.xuanyusong.com/archives/512 借用记录一段 触摸物体 旋转缩放的代码 背景:最近写一个小项目把一个全景720的VR 全景图,变成网页版可以操作的效果,刚刚解决UI自适应问题,现在发现触摸出问题,原来是从Unity的鼠标交互自动转成的触摸,发现不稳定,点击总是会改变摄像机视角,但是同样发布后的web在电脑上打开用鼠标点就没有问题。我想应该...

leoysq的博客 1654

Unity WebGL打包后的鼠标偏移问题

鼠标偏移如图 google后找到了一个解答 : [Need Help] Webgl build input position is incorrect/offset 原因是chrome上的canvas不能正确返回宽高,我们可以在网页初始化的时候手动设置,在Index.html,添加初始化script如下 var factor=1.56; var prew=document.querySelector("#\\#canvas").width; var preh=document.querySelector

qq_43380015的博客 2321

运用Unity内置Input.GetTouch在移动端实现多点触控事件

Input.GetTouch在移动端实现多点触控的代码,及利用Unity Remote5进行测试

【Unity开发】Unity中触摸和鼠标操作的几个问题

关键点1:在unity中touch事件同时也会触发GetMouseButton事件,有时候可能会给你带来方便,但是如果没有意识到这个问题的话,也很可能给你带来很大的麻烦。 关键点2:触摸操作也可以使用Input.GetAxis("Mouse X")(或"Mouse Y",下同,略去不写)来判断指尖移动的距离,虽然这点很方便,但是这样就带来了另外两个问题,见关键点3和4; 关键点3:

总有一天,我有属于我的甜 1万+

如何浏览与下载全球免费的地图高分辨率(亚米级)的遥感影像?

前言 如果你想使用商业卫星的高分辨遥感影像,一般价格昂贵。我们可以使用地图平台上免费的高分辨率数据。目前数据源很多,比如说google earth、天地图、四维地球、必应地图等等。这些影像统一有一个共同点就是:RGB三波段;Web地图瓦片服务。这意味着我们可以通过瓦片服务下载影像,但下载的影像只有三个波段,分别是 一.引言 二、可使用高分辨率的地图数据源 1.Google Earth影像 2.Esri World Image 3.天地图 4.必...

锐多宝的地理空间 2万+

STM32CubeMX最新版下载安装全攻略(附官网访问问题解决方案)

本文提供了STM32CubeMX最新版的详细下载与安装指南,并针对国内开发者常见的官网访问缓慢、注册验证邮件延迟等问题,给出了实用的解决方案和备选策略。通过清晰的步骤解析,帮助用户快速部署这一强大的STM32图形化配置工具,从而高效启动嵌入式开发项目。

weixin_28256233的博客 196

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

**关键点1:**在unity中touch事件同时也会触发GetMouseButton事件,有时候可能会给你带来方便,但是如果没有意识到这个问题的话,也很可能给你带来很大的麻烦。 **关键点2:**触摸操作也可以使用Input.GetAxis(“MouseX”)(或"MouseY",下同,略去不写)来判断指尖移动的距离,虽然这点很方便,但是这样就带来了另外两个问题,见关键点3和4; **关键点3:...

Wmayy_123的博客 1667

CUDA编译踩坑实录:如何正确设置-gencode参数适配你的GPU算力

本文深入解析CUDA编译中-gencode参数的核心原理与实战配置,帮助开发者解决常见的'Unsupported gpu architecture'错误。通过厘清虚拟架构与真实架构的区别,并提供多版本兼容的CMake配置方案,确保编译出的代码能精准适配不同GPU算力,兼顾性能与广泛兼容性。

weixin_28829903的博客 338

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

转自:http://blog.sina.com.cn/s/blog_4148e8630101velz.html关键点1:在unity中touch事件同时也会触发GetMouseButton事件,有时候可能会给你带来方便,但是如果没有意识到这个问题的话,也很可能给你带来很大的麻烦。 关键点2:触摸操作也可以使用Input.GetAxis(“Mouse X”)(或”Mouse Y”,下同,略去不写)来

Spades_J 的博客 1786

别再怕非观测区了!手把手教你用移相法搞定PMSM单电阻FOC的电流重构难题

本文详细解析了永磁同步电机(PMSM)单电阻FOC系统中非观测区的电流重构难题,重点介绍了移相法的工程实践。通过STM32平台的具体实现和调试指南,帮助工程师有效解决相电流检测中的采样窗口不足问题,提升系统稳定性和性能。

weixin_27252001的博客 433

TI Sitara PRU可编程实时单元:工业自动化中的硬实时协处理器解析

在嵌入式系统与工业自动化领域,实时性和确定性是核心需求。实时性指系统对外部事件做出响应的可预测时间,确定性则要求响应时间严格一致,不受其他任务干扰。其技术原理通常通过专用硬件或实时操作系统实现,例如采用独立于主CPU的协处理器来处理高精度时序任务。这种设计的技术价值在于,它能将主CPU从高实时性要求的任务中解放出来,专注于复杂业务逻辑,同时确保关键IO操作达到纳秒级延迟和极低抖动。应用场景广泛覆盖伺服电机控制、工业通信协议加速和多接口扩展等。本文聚焦的TI Sitara系列PRU(可编程实时单元),正是此类

weixin_42526068的博客 284

【100个 Unity实用技能】☀️ | Unity InputSystem中拿到触摸屏幕的坐标,鼠标的坐标等

在Unity的新输入系统InputSystem中,获取键盘鼠标的API发生了变化,不再是之前用Input.就可以拿到了。 本文将在InputSystem中获取键盘鼠标的新API做一个简单总结整理。

努力前行,总会成为自己心中的那道光 4591

Qt | linux+openCV+Qt6.5.3环境搭建成功版(带例子)

opencv安装 Qt 实战举例

Qt历险记,专注Qt技术,三年医疗设备研发经验,1年机器视觉研发经验,半年柔性传感研发经验。 1885

[unity]如何判断鼠标/触摸滑动方向

[unity]如何判断鼠标/触摸滑动方向 PC端跟手机端都可以用 Vector2 lastPos;//鼠标上次位置 Vector2 currPos;//鼠标当前位置 Vector2 offset;//两次位置的偏移值 void Update() { if (Input.GetMouseButtonDown(0)) { ...

qq_43529739的博客 4176

2、稳定性问题全景图——死机、重启、ANR、Crash、黑屏五大类

当 Crash 发生在 system_server、surfaceflinger、mediaserver 等关键系统进程中时,其后果等同于系统级故障,可能触发 Zygote 重启甚至 kernel panic。这类问题在稳定性治理中的优先级应等同于 P0。

woailuojp的博客 49

倍福PLC--PERSISTENT断电保持数据和BOOT中各文件对应的解析

将D:\TC3程序\TwinCAT Project146\TwinCAT RT(x86)\Plc 文件夹的中三个替换文件复制到:G:\TwinCAT\3.1\Boot\Plc完成替换,如下图。(2) 找到程序所存的路径,编程电脑的D:\TC3程序\TwinCAT Project146路径下,并选择对应系统平台TwinCAT RT(x86)(3) 控制器断电,拔出内存卡,使用读卡器,在编程电脑中打开:(本次测试读卡器为G盘)(5) 开机完成后,TwinCAT自动运行,当前闪灯频率为50ms。

weixin_41883890的博客 2344
上一篇: unity3d输入与控制——键盘事件
下一篇: Unity中鼠标左键按下,拖拽物体移动
cbbbc
博客等级 码龄15年 609粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值