C# 通过Unity3D Remote使用Android加速计-Z轴要在180度平面上测量,而不是360度

C# 通过Unity3D Remote使用Android加速计-Z轴要在180度平面上测量,而不是360度,c#,android,unity3d,unityscript,C#,Android,Unity3d,Unityscript,首先,我是Unity和Android的总n00B,但我已经让它工作了…75%,并希望它达到100% 我使用Unity3D通过Unity Remote从我的Android RazrM接收加速计数据。我正在使用这些数据在游戏中移动 手机上的Z轴是从上到下的纵向视图,Unity3D中的Z轴是屏幕内外的深度 我正面朝上使用手机,当手机平放在桌子上时,第一人称控制器不动。当我将手机从水平方向(0)向前倾斜时,我(作为第一人称控制器)向前移动。这很好,但当我将手机从水平方向向后倾斜时,我也会向前移动 我相信

首先,我是Unity和Android的总n00B,但我已经让它工作了…75%,并希望它达到100%

我使用Unity3D通过Unity Remote从我的Android RazrM接收加速计数据。我正在使用这些数据在游戏中移动

手机上的Z轴是从上到下的纵向视图,Unity3D中的Z轴是屏幕内外的深度

我正面朝上使用手机,当手机平放在桌子上时,第一人称控制器不动。当我将手机从水平方向(0)向前倾斜时,我(作为第一人称控制器)向前移动。这很好,但当我将手机从水平方向向后倾斜时,我也会向前移动

我相信这是因为Z轴是360度的。所以颠倒过来,手机会给我加速度值和我想要的向后运动。不幸的是,我不可能不停地翻动手机。它必须面朝上

我该怎么做才能知道z轴在哪个象限?有什么条件我可以阅读吗?这款手机没有陀螺仪。下面是我的C#脚本。X轴使玩家左右移动,Z轴只是向前移动,没有向后移动

public class Movement2 : MonoBehaviour {
public float moveX = Input.acceleration.x;
public float moveY = Input.acceleration.y;
public float moveZ = Input.acceleration.z;
public int zeroZFlag;   

void Update () {
    moveX = Input.acceleration.x * 1;
    moveY = 0;
    moveZ = (1+ (Input.acceleration.z)); //~0.036 when flat, moveZ stays positive
    transform.Translate (0, 0, 0);       // no movement when flat

    if (moveZ >= 0.055 && moveZ >= -0.1){
    transform.Translate(moveX, moveY, moveZ);       
    zeroZFlag = 1;  
   }
编辑: 我找到了解决这个问题的方法,我把它贴在网上,希望其他人能从中得到帮助。 我使用了Y轴和Z轴的组合,Y轴在一个方向为负,另一个方向为正,Z轴一直为正。 代码如下:

public class Movement2 : MonoBehaviour {
public float moveX = Input.acceleration.x;
public float moveY = Input.acceleration.y;
public float moveZ = Input.acceleration.z;
public short zeroZFlag;

void Update () {
    moveX = Input.acceleration.x * 1;
    moveY = Input.acceleration.y * 1;;
    //moveZ = (1-(Mathf.Abs(Input.acceleration.z * 1)));
    moveZ = (1+ (Input.acceleration.z)); //~0.036 when flat, moveZ stays positive
    transform.Translate (0, 0, 0);

    if (moveZ >= 0.055 && moveZ >= -0.1) { zeroZFlag = 1;                       
                    if (moveY >= 0) {
                    transform.Translate (moveX, 0, moveZ);
                    }
                    if (moveY < 0){
                    transform.Translate (moveX, 0, -moveZ);
                    }
     else {
     zeroZFlag = 0;  
     }
    }
公共类移动2:单一行为{
公共浮点数moveX=Input.acceleration.x;
公共浮点数moveY=Input.acceleration.y;
公共浮点数moveZ=Input.acceleration.z;
公共短期零滞后;
无效更新(){
moveX=输入加速度x*1;
moveY=输入加速度y*1;;
//moveZ=(1-(Mathf.Abs(Input.acceleration.z*1));
moveZ=(1+(Input.acceleration.z));//~0.036平坦时,moveZ保持正值
transform.Translate(0,0,0);
如果(moveZ>=0.055&&moveZ>=0.1){zeroZFlag=1;
如果(移动>=0){
transform.Translate(moveX,0,moveZ);
}
if(moveY<0){
transform.Translate(moveX,0,-moveZ);
}
否则{
零滞后=0;
}
}

更简单的实现可能如下所示

rigidbody.AddForce (new Vector3(Input.acceleration.x, 0, -Input.acceleration.z));
添加刚体组件并通过添加力修改速度是首选方法