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

原创 2015年07月09日 21:57:36

关键点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);
    }
}
版权声明:请尊重原创内容,转载请注明来源及链接。

Unity中的Input.Touch,移动端的触摸操作

这篇博文将简单的记录,如何用unity处理在移动设备上的触控操作。     iOS和Android设备能够支持多点触控。在unity中你可以通过Input.touches属性集合访问在最近一帧中触摸...
  • qq_23156791
  • qq_23156791
  • 2016年01月03日 23:49
  • 13674

Unity 3D——Touch的用法

if (Input.touchCount >= 1) { Touch touch = Input.GetTouch(0); ...
  • k1246195917
  • k1246195917
  • 2014年08月29日 15:28
  • 1615

Unity之使用IOS 3DTouch功能

Unity之使用IOS 3DTouch
  • qq_26999509
  • qq_26999509
  • 2017年04月26日 16:53
  • 525

Unity 单指与双指Touch事件捕获

最近整理了一下项目用到的touch事件捕获管理逻辑,贴出来,算是记一下。 using UnityEngine; using System.Collections; using UnityEngine....
  • reipeng
  • reipeng
  • 2016年03月23日 08:08
  • 3545

Unity中用触摸控制物体旋转和放大

void Update () { //单点触摸 if( 1 == Input.touchCount ){ Touch touch = Input.GetTouch (0); V...
  • konga
  • konga
  • 2015年05月31日 15:47
  • 15235

Unity3D手机中Input类touch详解

Unity3D手机中Input类touch详解: 1.Input.touchCount 触摸随之增长,一秒50次增量。 2.Input.GetTouch(0).phase==TouchPh...
  • hany3000
  • hany3000
  • 2015年04月14日 07:25
  • 5581

3DTouch在Unity游戏开发中的一个坑

起因  游戏测试过程中有这样一个反馈, 按住控制角色行走, 当按住触摸屏幕左铡边缘部位时, 有时会有1秒左右的延迟. 很是影响游戏的体验. 多次测试后, 具体表现为 表现 1. 支持3DTouch的设...
  • rct1985
  • rct1985
  • 2016年11月11日 11:41
  • 1015

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

关键点1:在unity中touch事件同时也会触发GetMouseButton事件,有时候可能会给你带来方便,但是如果没有意识到这个问题的话,也很可能给你带来很大的麻烦。 关键点2:触摸操作也可以使...
  • poda_
  • poda_
  • 2016年05月06日 19:28
  • 3677

Input.GetTouch 获取触摸

Input.GetTouch 获取触摸 static function GetTouch (index : int) : Touch Description描述 Return...
  • kong1287988804
  • kong1287988804
  • 2017年02月26日 12:40
  • 629

Unity 视角 第一人称脚本 MouseLook

研究了一下第一人称控制器后,把它的
  • chenggong2dm
  • chenggong2dm
  • 2014年06月30日 12:00
  • 32193
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Unity中触摸和鼠标操作的几个问题
举报原因:
原因补充:

(最多只允许输入30个字)