[计算机] 【Unity坑】一 判定鼠标和触摸

查看:231 |回复:12 | 2024-11-1 21:48:54

您需要 登录 才可以下载或查看,没有账号?注册

x
本帖最后由 雾切酱 于 2018-11-15 10:27 编辑

processed_highres_2208780221.png


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

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

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



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

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

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

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


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

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

  2. 使用deltaPosition同样没有任何问题,因为这就是为触摸操作而设计的。
点击此处复制文本






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



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



事件回顾:

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

  1. if(Input.GetMouseButton(0) || (Input.touchCount>0 && Input.GetTouch(0).phase == TouchPhase.Moved)
点击此处复制文本


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



惯性旋转物体脚本:

  1. using UnityEngine;

  2. using System.Collections;

  3. //操作方式

  4. public enum ControlType{

  5.         mouseControl,

  6.         touchControl,

  7. }

  8. public class RotateTarget: MonoBehaviour

  9. {

  10.         public ControlType controlType;

  11.         public Transform rotTarget;



  12. //旋转速度加成系数

  13.         public float rotSpeedScalar;

  14.         private float currentSpeed = 0;
点击此处复制文本
  1. void Update()

  2.     {

  3.         if (controlType==ControlType.mouseControl)

  4.         {

  5.                 //鼠标操作
  6.                   if (Input.GetMouseButton(0))
  7.                 {
  8.                         //拖动时速度
  9.                         //鼠标或手指在该帧移动的距离*deltaTime为手指移动的速度,此处为Input.GetAxis("Mouse X") / Time.deltaTime
  10.                         //不通帧率下lerp的第三个参数(即混合比例)也应根据帧率而不同--
  11.                         //考虑每秒2帧和每秒100帧的情况,如果此参数为固定值,那么在2帧的情况下,一秒后达到目标速度的0.75,而100帧的情况下,一秒后则基本约等于目标速度
  12.                           currentSpeed = Mathf.Lerp(currentSpeed, Input.GetAxis("Mouse X") / Time.deltaTime,0.5f*Time.deltaTime);
  13.                 } else
  14.                 {
  15.                         //放开时速度
  16.                           currentSpeed = Mathf.Lerp(currentSpeed, 0, 0.5f*Time.deltaTime);
  17.                 }
  18.         }
  19.          else if(controlType==ControlType.touchControl)
  20.         {
  21.                 //触摸操作
  22.                   if (Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Moved)
  23.                 {
  24.                         //在安卓设备上也可以用Mouse X,根据实验,touch[0].deltaPosition.x的值总是比Mouse X的值大很多,所以此处使用Mouse X
  25.                            currentSpeed = Mathf.Lerp(currentSpeed, Input.GetAxis("Mouse X")/Time.deltaTime,0.5f*Time.deltaTime);
  26.                 } else
  27.                 {
  28.                         //放开时速度
  29.                            currentSpeed = Mathf.Lerp(currentSpeed, 0, 0.5f*Time.deltaTime);
  30.                 }
  31.         }
  32.                   rotTarget.Rotate(Vector3.down, Time.deltaTime * currentSpeed * rotSpeedScalar);
  33.         }
  34. }
点击此处复制文本




评分

参与人数 1活跃度 +15 展开 理由
微凉. + 15 【给力】阅贴无数,楼主最强!

查看全部评分

2024-11-1 21:48:54  
 赞 赞 0

使用道具 登录

12个回答,把该问题分享到群,邀请大神一起回答。
2#
详细的讲解感谢分享
回复 收起回复
2018-9-19 08:33:59   回复
 赞 赞 0

使用道具 登录

3#
感谢分享
回复 收起回复
2018-9-21 14:01:22   回复
 赞 赞 0

使用道具 登录

4#
感谢分享
回复 收起回复
2018-11-12 09:30:21   回复
 赞 赞 0

使用道具 登录

5#
感谢分享
回复 收起回复
2018-11-12 09:49:24   回复
 赞 赞 0

使用道具 登录

6#
6666666666666666666
回复 收起回复
2018-11-12 09:52:47   回复
 赞 赞 0

使用道具 登录

7#
......................................
回复 收起回复
2018-11-12 10:20:07   回复
 赞 赞 0

使用道具 登录

8#
谢谢分享
回复 收起回复
2018-11-13 10:15:51   回复
 赞 赞 0

使用道具 登录

9#
谢谢分享
回复 收起回复
2018-11-13 10:15:55   回复
 赞 赞 0

使用道具 登录

10#
感谢分享
回复 收起回复
2018-11-15 10:14:51   回复
 赞 赞 0

使用道具 登录

11#
想要成大触,天天上元素
回复 收起回复
2018-11-21 00:10:03   回复
 赞 赞 0

使用道具 登录

12#
谢谢分享
回复 收起回复
2019-3-7 20:32:11   回复
 赞 赞 0

使用道具 登录

13#
回复 收起回复
2023-2-26 12:39:19   回复
 赞 赞 0

使用道具 登录

CG 游戏行业专业问题

技术文库图文教程技术文章程序逻辑
显示全部 8
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表