2017-06-05 293 views
0

我有一个横向的Unity游戏。我希望能够将相机旋转到左侧和右侧。更重要的是,我想根据y轴上的陀螺倾斜和左右旋转的总向量来前后移动相机。换句话说,我希望能够像走在房间里的人一样移动相机。相机是我游戏的主角。如何在Unity中使用陀螺仪移动相机

这就是我试图做的:

GameObject CamParent; 
Rigidbody RB; 

void Start() 
{ 

    CamParent = new GameObject("CamParent"); 
    CamParent.transform.position = this.transform.position; 
    this.transform.parent = CamParent.transform; 
    Input.gyro.enabled = true; 
    RB = this.GetComponent<Rigidbody>(); 
} 

void Update() 
{ 
    CamParent.transform.Rotate(0, -Input.gyro.rotationRateUnbiased.y, 0); 
    this.transform.Rotate(-Input.gyro.rotationRateUnbiased.x, 0,0); 
    float Z = -Input.gyro.userAcceleration.z; 
    RB.AddForce(new Vector3(0,0,Z)*10); 
} 
+1

我不确定我是否理解你正在尝试做什么,但是为相机父项添加一个刚体并且向其添加力而不是直接向相机添加力是否更有意义?否则,当相机从其原始位置移开时,旋转相机父母的效果将会改变。 – lockstock

回答

0

我已经尝试回答你的问题,尽我所能,为你的问题问得有点我不清楚。

首先,由于您使用的是力和物理,您应该使用void FixedUpdate()函数而不是void Update()函数。这将确保您的代码以统一的时间间隔执行,这在处理物理时非常重要。

我也不确定你为什么实例化一个新的GameObject。您可以简单地将此脚本添加到Unity中的Camera GameObject中,然后将Rigidbody组件添加到相机中。这将简化您的Start()功能,它应该只包含以下两行:

Input.gyro.enabled = true; 
RB = gameObject.GetComponent<Rigidbody>(); 

其次,要注意的是四元数从Input.gyro.attide返回了左手坐标,而团结具有右手坐标是很重要的。从陀螺仪到Unity这种转换可以用下面的函数来完成:

Quaternion GyroToUnity(Quaternion quat) 
{ 
    return new Quaternion(quat.x, quat.z, quat.y, -quat.w); 
} 

我敢肯定还有其他的方法来完成这种转换,但这种方式对我的作品。

现在让我们来处理相机的旋转。通过设置相机的transform.rotation等于您刚从陀螺仪转换的四元数来设置相机的旋转开始。然而,还有一个问题,因为陀螺仪的z轴指向与Unity的y轴相同的方向。这可以通过简单地执行transform.Rotate(90,0,0);来解决。最后,我们使用以下这行代码设置相机的旋转:

transform.rotation = Quaternion.Euler(new Vector3(0f, transform.rotation.eulerAngles.y, 0f)); 

最后,我们必须处理向相机添加力。我不确定你想如何处理运动,但我认为你想要相对于相机的旋转z轴的运动。为此,您需要使用相机上Rigidbody组件的AddRelativeForce(Vector3 relativeForce)

但是,要确定力的方向,我们必须从早先转换为Unity的Quaternion获得关于x轴的旋转度。 yourQuat.eulerAngles.x,它返回一个float,使得0 < = x < 360.通过我们定位相机坐标系的方式,直接使用iOS设备应该返回大约0.0的值。当我在这个问题上发挥的时候,我发现这段代码充分执导的相机:

Vector3 relativeForce; 
if (yourQuat.eulerAngles.x > 315 || yourQuat.eulerAngles.x < 90) 
    relativeForce = Vector3.forward; 
else if (yourQuat.eulerAngles.x < 315) 
    relativeForce = Vector3.back; 
else 
    relativeForce = Vector3.zero; 

最后采取后续Vector3值,并使用像这样

RB.AddRelativeForce(relativeForce);

希望有所帮助。如果这不是您正在寻找的确切功能,这应该让您开始微调您的程序以完成您想要的功能。