Unity3d 第一人称太空船俯仰和偏航isue

Unity3d 第一人称太空船俯仰和偏航isue,unity3d,input,transform,rigid-bodies,Unity3d,Input,Transform,Rigid Bodies,一段时间以来,我一直在尝试使用不同的教程来获得一个很好的第一人称驾驶舱视图宇宙飞船控制系统。我尝试过只使用鼠标、只使用键盘和组合键,但在所有教程中都遇到同样的问题。即使是这一行简单的代码也可以: transform.position += transform.forward * Time.deltaTime * 90f; transform.Rotate( Input.GetAxis("Vertical"), Input.GetAxis("Horizontal"), 0.0f);

一段时间以来,我一直在尝试使用不同的教程来获得一个很好的第一人称驾驶舱视图宇宙飞船控制系统。我尝试过只使用鼠标、只使用键盘和组合键,但在所有教程中都遇到同样的问题。即使是这一行简单的代码也可以:

    transform.position += transform.forward * Time.deltaTime * 90f;
    transform.Rotate( Input.GetAxis("Vertical"), Input.GetAxis("Horizontal"), 0.0f);
我一直遇到的问题是,如果我投球就可以了。我觉得没问题。但是如果我同时做这两件事,我会沿着对角线方向旋转,这也会使我的飞船在Z轴上旋转,并且弄乱我的方向。我试着在刚体中锁定z旋转,但也没有帮助。我试着让自己的代码交替使用apply torque和Simple rotation,遵循了一些教程,包括这一个:但不断遇到旋转问题

我想做的是一个像旧游戏一样控制的游戏

你们有谁知道我能让飞船控制器工作的方法吗

--编辑---

现在有点远了。它不再在我的z轴上旋转,因为我一直将它设置为0。现在唯一的问题是,如果我试着做一个循环,船就会翻转而不是很好地循环

        if (Input.GetKey("up"))
    {
        transform.Rotate(transform.right * -ShipPanSpeed * Time.deltaTime, Space.World);
    }

    if (Input.GetKey("down"))
    {
        transform.Rotate(transform.right * ShipPanSpeed * Time.deltaTime, Space.World);
    }

    if (Input.GetKey("left"))
    {
        transform.Rotate(transform.up * -ShipPanSpeed * Time.deltaTime,Space.World);
    }

    if (Input.GetKey("right"))
    {
        transform.Rotate(transform.up * ShipPanSpeed * Time.deltaTime,Space.World);
    }

    float z = transform.eulerAngles.z;
    transform.Rotate(0, 0, -z);

您可以尝试为控件创建一个父对象,然后创建一个子对象,使其可以为轴旋转,但不附加旋转旁边的任何移动

我的意思是,可以在Y轴上旋转父对象,使其旋转,同时向前或向后移动变换。如果要向上或向下旋转,可以在向上/向下变换与要旋转的轴相乘的同时向前变换

例如:

private void Update(){
  //PARENT--------------------------------------------

  // MOVING FORWARD AND BACKWARD
  transform.position += transform.forward * Input.GetAxis("Vertical") * speed * Time.deltaTime();

  // MOVING RIGHT AND LEFT
  transform.position += transform.right * Input.GetAxis("Horizontal") * speed * Time.deltaTime();

  //PIVOT UP AND DOWN
  transform.position += transform.up * -Input.GetAxis("Mouse Y") * speed * Time.deltaTime();

  //ROTATE AROUND THE Y AXIS
  tranform.Rotate(0f, Input.GetAxis("Horizontal") * rotationspeed, 0f);


}
对于pivot的spaceship child,我建议您制作一个emptyobject,并将芯片设置为基于用于上/下和前/后移动的输入轴查看该对象


希望这对你有所帮助,或者至少给了你一个制作的想法:

你给了我正确的方法,但现在已经解决了一半。现在它停止在Z轴上旋转,但如果我尝试做一个循环,它会翻转而不是继续旋转。我用新的脚本编辑了这个问题我稍微改变了你的方式。我为Y轴旋转做了一个额外的父轴,让X轴在船上旋转。现在它就像一个符咒:D