需求
当游戏显示3d场景及其UI的时候。玩家左右晃动手机的时候,UI界面会随之左右偏移。上下晃动的时候,3D场景会随之上下偏移。手机停止晃动的时候,如若偏移的UI或场景,停顿一会后自动恢复到初始默认位置。
github:https://github.com/luckyWjr/Demo
分析
首先本文功能应对的是横屏游戏(竖屏游戏的话也差不多一样,大家自己拓展下),假设当我们拿起手机玩游戏,手机会有四个部位,分别为左手拿的左手边和右手拿的右边,以及屏幕内容的上方和下方(下文中会用左手边,右手边,上方,下方来描述)。每个部位的倾斜都会造成UI或场景的偏移效果
我们可以先用一个枚举来定义这四个部位的倾斜情况
public enum EGyroType
{
NoRotate,//不旋转
ToUp,//手机下方向上倾斜
ToDown,//手机下方向下倾斜
ToLeft,//左手边向下倾斜
ToRight,//右手边向下倾斜
}
接着我们可以使用Unity的陀螺仪接口Input.gyro的一些属性,来判断当前手机的倾斜状态,Gyroscope有如下属性:
rotationRate |
Returns rotation rate as measured by the device's gyroscope. 返回设备陀螺仪测量的旋转速率。 |
rotationRateUnbiased | Returns unbiased rotation rate as measured by the device's gyroscope. 返回由设备陀螺仪测量的无偏旋转速率。 |
gravity |
Returns the gravity acceleration vector expressed in the device's reference frame. 返回在设备参考帧的重力加速度。 |
userAcceleration | Returns the acceleration that the user is giving to the device. 返回用户提供 给设备的加速度。 |
attitude | Returns the attitude of the device. 返回设备的姿态。 |
enabled | Sets or retrieves status of this gyroscope. 设置或检索该陀螺仪的状态。 |
updateInterval | Sets or retrieves gyroscope interval in seconds. 设置或检索该陀螺仪的间隔,以秒为单位。 |
我用到enabled和gravity两个属性,enabled用于打开或者关闭陀螺仪功能,而gravity返回的是一个Vector3变量,具体情况对应的返回值,通过打印Log在android手机上显示如下(横屏游戏,纪录了某种情况下的某个不特定的角度的gravity值):
当手机横着屏幕朝上水平放置在桌上的时候,返回值为:(0.0, 0.0, -1.0)
上下倾斜:
当手机下方向上倾斜时,某个角度(转角小于90度)的返回值为:(0.0, 0.4, -0.9),角度再大的话屏幕的内容会翻转过来。
当手机下方向下倾斜时,某个角度(转角小于90度)的返回值为:(0.0, -0.5, -0.9),转角为90度时:(0.0, -1.0, 0.0),转角在90度到180度中时:(0.0, -0.8, 0.6),180度时即屏幕正朝下为:(0.0, 0.0, 1.0),若角度再大一点为:(0.0, 0.3, 0.9),直至屏幕内容翻转过来。
我们可以发现
1.当 z < 0 , y > 0:当y的值变大则为ToUp,变小则为ToDown
2.当 z < 0 , y < 0:当y的值变大则为ToUp,变小则为ToDown
3.当 z > 0 , y < 0:当y的值变大则为ToDown,变小则为ToUp
4.当 z > 0 , y > 0:当y的值变大则为ToDown,变小则为ToUp
5.当 z < 0 变为 z > 0,则为ToDown,反之则为ToUp
前四条总结下来就是,当 z < 0,y的值变大则为ToUp,变小则为ToDown。当 z > 0,y的值变大则为ToDown,变小则为ToUp
左右倾斜:
当手机左手边向下倾斜时,某个角度(转角小于90度)的返回值为:(-0.2, 0.0, -1.0),转角为90度时:(-1.0, 0.0, 0.0),转角在90度到180度中时:(-0.6, 0.0, 0.8)
当手机右手边向下倾斜时,某个角度(转角小于90度)的返回值为:(0.6, 0.0, -0.8),转角为90度时:(1.0, 0.0, 0.0),转角在90度到180度中时:(0.8, 0.0, 0.5)
可以总结出
1.当 z < 0 , x < 0