unity重力感应的三个轴是有默认轴向的,但是如果不以玩家当前手持方向为初始方向去做重力感应操作的话,效果就会很不理想。
百度了很多,发现没有一个文章是介绍以玩家手持设备的当前方向为基准,记录重力感应的变化的。
于是转战谷歌,在一篇文章下发现了方法。
这是原址,不晓得需不需要翻墙:
https://forum.unity.com/threads/input-acceleration-calibration.317121/
不想看或看不懂老外的解释的,下面就是原文的总结:
在进入移动操作的时候,也就是在Start函数里,初始化一个矩阵,在此矩阵的基础上,做一个重力感应的校正。
然后每次需要获取当前重力感应分量的时候,去做一个矩阵的乘法,即可得到以进入游戏时玩家手持设备的水平面为基准的重力感应偏移量,然后去做你的位移操作。
下面是代码:
//校正矩阵
Matrix4x4 baseMatrix = Matrix4x4.identity;
//Start函数里面调用,给矩阵赋值
void CalibrateAcceleration()
{
Quaternion rotate = Quaternion.FromToRotation(new Vector3(0.0f, 0.0f, -1.0f), Input.acceleration);
Matrix4x4 matrix = Matrix4x4.TRS(Vector3.zero, rotate, new Vector3(1.0f, 1.0f, 1.0f));
this.baseMatrix = matrix.inverse;
}
//已经校正过的重力感应偏移量,用这个分量去做移动操作
public Vector3 AdjustedAccelerometer
{
get
{
return this.baseMatrix.MultiplyVector(Input.acceleration);
}
}
//重力感应操作
void GravityOperating()
{
//gravitySensitivity自定义的灵敏度
if (Mathf.Abs(AdjustedAccelerometer.x) > gravitySensitivity || Mathf.Abs(AdjustedAccelerometer.y) > gravitySensitivity)
{
playerMoveDir = new Vector3(AdjustedAccelerometer.x, AdjustedAccelerometer.y, 0);
}
}
就是这样。