Unity 3D使用用户输入在轨道上移动对象

时间:2018-12-23 20:11:23

标签: c# unity3d

我有一个太空飞船可以按照以下脚本绕行星轨道飞行:

Update() {
    transform.RotateAround(planet.transform.position, Vector3.up, speed * Time.deltaTime);
}

但是我不明白如何将用户输入(Input.GetAxis(“ Horizo​​ntal”)和Input.GetAxis(“ Vertical”))添加到此脚本,以便用户可以控制飞船的运动。如何使用用户输入(箭头)将飞船绕轨道移动?

编辑: Camer从后面跟随船。船在行星的轨道上以某种力(速度)向前移动(为简化起见,它只是一个圆)。我希望用户能够像在钉子(从D1到D2)中那样改变运动方向(左\右)。

Example

Space Ship on planets orbit

1 个答案:

答案 0 :(得分:1)

此任务可以分为两部分。首先是根据用户输入旋转船。第二个是更改我们的绕行方法,以考虑船舶的旋转,使其沿其面向的方向运动。

我们可以使用Transform.Rotate来解决第一部分。由于我们希望船的底部始终面对行星,因此我们希望沿着船的“上”轴旋转。对于我们的输入轴,“水平”可能是最直观的。看起来像这样:

transform.Rotate(Vector3.forward, Input.GetAxis("Horizontal") * rotateSpeed * Time.deltaTime);

对于第二部分,重要的是要意识到Transform.RotateAround使用的是世界空间,而不是局部空间。通过使用船舶的局部空间,它将解释船舶的旋转,从而使船舶将沿其面向的方向移动,而不是沿独立的方向移动。我们可以使用Transform.TransformDirection函数来做到这一点。看起来像这样:

transform.RotateAround(planet.transform.position, transform.TransformDirection(Vector3.up), speed * Time.deltaTime);

将它们结合到更新功能中,对我进行了快速测试。


此外,如果我们希望船舶在不进行任何本地旋转的情况下从一侧向另一侧扫掠,则可以通过另一个Transform.RotateAround调用来做到这一点,例如:

transform.RotateAround(planet.transform.position, transform.TransformDirection(Vector3.right), Input.GetAxis("Horizontal") * strafeSpeed * Time.deltaTime);

(回答问题编辑的答案)