代码之家  ›  专栏  ›  技术社区  ›  Vito Karleone

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

  •  0
  • Vito Karleone  · 技术社区  · 6 年前

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

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

    但我不明白如何在这个脚本中添加用户输入(Input.GetAxis(“水平”)和Input.GetAxis(“垂直”),这样用户就可以控制宇宙飞船的运动。如何使用用户输入(箭头)使宇宙飞船绕轨道运行?

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

    Example

    Space Ship on planets orbit

    1 回复  |  直到 6 年前
        1
  •  1
  •   adisib    6 年前

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

    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(planet.transform.position, transform.TransformDirection(Vector3.right), Input.GetAxis("Horizontal") * strafeSpeed * Time.deltaTime);
    

    (答案编辑为问题编辑)