C# Unity 3D使用用户输入绕轨道移动对象

C# Unity 3D使用用户输入绕轨道移动对象,c#,unity3d,C#,Unity3d,我有一艘宇宙飞船,它绕着行星轨道飞行,脚本如下: Update() { transform.RotateAround(planet.transform.position, Vector3.up, speed * Time.deltaTime); } 但我不明白如何在这个脚本中添加用户输入(Input.GetAxis(“水平”)和Input.GetAxis(“垂直”),这样用户就可以控制宇宙飞船的运动。如何使用用户输入(箭头)使宇宙飞船绕轨道运行 编辑: 摄影师从后面跟着船。飞船在行星轨

我有一艘宇宙飞船,它绕着行星轨道飞行,脚本如下:

Update() {
    transform.RotateAround(planet.transform.position, Vector3.up, speed * Time.deltaTime);
}
但我不明白如何在这个脚本中添加用户输入(Input.GetAxis(“水平”)和Input.GetAxis(“垂直”),这样用户就可以控制宇宙飞船的运动。如何使用用户输入(箭头)使宇宙飞船绕轨道运行

编辑: 摄影师从后面跟着船。飞船在行星轨道上以一定的力(速度)向前移动(简单地说,它只是一个圆)。我希望用户能够改变移动方向(左\右),就像在折叠中一样(从D1到D2)


此任务可分为两部分。首先是根据用户输入旋转船舶。第二个是改变我们的轨道方法,考虑到飞船的旋转,使它朝着它所面对的方向移动

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

transform.Rotate(Vector3.forward, Input.GetAxis("Horizontal") * rotateSpeed * Time.deltaTime);
transform.RotateAround(planet.transform.position, transform.TransformDirection(Vector3.up), speed * Time.deltaTime);
对于第二部分,重要的是要认识到,
Transform.RotateAround
使用的是世界空间,而不是局部空间。通过使用船舶的局部空间,它将考虑船舶的旋转,从而使船舶朝着其所面对的方向移动,而不是朝着独立的方向移动。我们可以使用
Transform.TransformDirection
函数来实现这一点。它看起来像这样:

transform.Rotate(Vector3.forward, Input.GetAxis("Horizontal") * rotateSpeed * Time.deltaTime);
transform.RotateAround(planet.transform.position, transform.TransformDirection(Vector3.up), speed * Time.deltaTime);
在一个快速测试中,将这些组合到更新函数中对我很有效


此外,如果我们想让飞船在不做任何局部旋转的情况下从一边到另一边扫射,我们可以通过另一个
变换来实现。RotateAround
调用,如下所示:

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


(答案编辑为问题编辑)

谢谢!但通过改变速度分量,用户只能向前和向后移动船舶。但我还想通过用户输入更改移动的方向\角度。对不起,上面的描述不清楚。那么你想让飞船依靠自身的力量移动,以及保持在轨道上的独立引力?要向前移动飞船,您需要类似于
transform.Translate(Input.GetAxis(“垂直”)*Vector3.forward*moveSpeed*Time.deltaTime)的东西transform.rotate(Input.GetAxis(“水平”)*Vector3.right*rotationSpeed*Time.deltaTime)的东西除当前轨道代码外。如果你更新你的描述,我会相应地更新我的答案。当然,像这样手动移动飞船会改变轨道的形状。如果一个精确的模拟是你所追求的,你可能想考虑比旋转的更高级的东西,让你模拟任何形状的轨道。我修改了我的答案。