【Unity开发】Unity中触摸和鼠标操作的几个问题
2016-05-06 19:28
465 查看
关键点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)如果使用触摸操作,再细分两种情形:
a. 如果使用if(Input.GetMouseButton(0))来作为判断是否按下的条件:
那么使用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)来做为判断是否按下的条件:
使用Input.GetAxis("Mouse X"),没有任何问题;
使用deltaPosition同样没有任何问题,因为这就是为触摸操作而设计的。
关键点4:实践中发现在直观感觉差不多的滑动过程(分别用鼠标拖动和手指拖动)中,Input.GetTouch(0).deltaPosition.x 的值总是比Input.GetAxis("Mouse
X")取得的值要大很多,分析可能是手机屏幕dpi比较大的原因,因此在实践中为了获取直观感受差不多的旋转速度,要分别调试旋转加成系数。
总结一下:不要使用一条代码判断两种情况,最好分开,做一个单选(可以使用Enum),要么鼠标操作,要么触摸操作,分别使用最合适的判断和函数,并分别调试旋转加成系数
关键点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)如果使用触摸操作,再细分两种情形:
a. 如果使用if(Input.GetMouseButton(0))来作为判断是否按下的条件:
那么使用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)来做为判断是否按下的条件:
使用Input.GetAxis("Mouse X"),没有任何问题;
使用deltaPosition同样没有任何问题,因为这就是为触摸操作而设计的。
关键点4:实践中发现在直观感觉差不多的滑动过程(分别用鼠标拖动和手指拖动)中,Input.GetTouch(0).deltaPosition.x 的值总是比Input.GetAxis("Mouse
X")取得的值要大很多,分析可能是手机屏幕dpi比较大的原因,因此在实践中为了获取直观感受差不多的旋转速度,要分别调试旋转加成系数。
总结一下:不要使用一条代码判断两种情况,最好分开,做一个单选(可以使用Enum),要么鼠标操作,要么触摸操作,分别使用最合适的判断和函数,并分别调试旋转加成系数
相关文章推荐
- Unity -- EventSystem完全掌握
- 使用Unity3d的Physics.Raycast()的用法做子弹射击
- Unity3D的场景单位 和 3D建模软件的单位 之间的关系
- unity3d发布一个Android的apk文件需要具备什么环境及具体操作步骤
- unity 游戏物体自动循环移动脚本
- unity5.x从入门到精通-7章
- Unity中的layer和tag
- 在Editor模式下编辑贝塞尔曲线
- Unity播放视频
- Unity3D MonoDevelop乱码解决方案
- Unity学习笔记11——UGUI动画插件DoTween
- 跨平台AR增强现实开发(四)(高通识别图5星处理方式)
- Unity Shaders and Effects Cookbook (6-2) 透明裁剪着色器
- Unity3D 使用高通AR(一)
- Root Motion深度解析[Unity]
- 关于Culling mask 初认识
- Unity3d+moba+草丛视野
- Unity Shaders and Effects Cookbook (6-1) 使用 alpha 参数的 半透明着色器
- Unity3D研究院之UGUI一个优化效率小技巧
- Unity5.0 EventSystem事件系统的详细说明