unity3d – 统一的汽车运动[复制]

参见英文答案 >
Unity3d Local Forward                                    2个

我正在努力制作一个统一的游戏,这个游戏使用汽车.我想要移动汽车,到目前为止我可以向前和向后移动它,我也可以向左和向右旋转它们,这两个动作都很好.

但是在我向右旋转之后,我试图让它向前移动,它朝着与之前相同的方向移动,而不考虑刚刚进行的转弯.它使它移动就像向前移动一侧旋转.我一直试图使用前向矢量的值,但我的尝试都没有产生好的结果.如果有人有一些好主意我很乐意听到他们.

public class CarMovement : MonoBehaviour
{
    public Rigidbody rb;
    public Transform car;
    public float speed = 17;

    Vector3 forward = new Vector3(0, 0, 1);
    Vector3 backward = new Vector3(0, 0, -1);

    Vector3 rotationRight = new Vector3(0, 30, 0);
    Vector3 rotationLeft = new Vector3(0, -30, 0);

    void FixedUpdate()
    {
        if (Input.GetKey("w"))                                         
        {
            rb.MovePosition(car.position + forward * speed * Time.deltaTime);
        }
        if (Input.GetKey("s"))
        {
            rb.MovePosition(car.position  + backward * speed * Time.deltaTime);
        }

        if (Input.GetKey("d"))
        {
            Quaternion deltaRotationRight = Quaternion.Euler(rotationRight * Time.deltaTime);
            rb.MoveRotation(rb.rotation * deltaRotationRight);
        }

        if (Input.GetKey("a"))
        {
            Quaternion deltaRotationLeft = Quaternion.Euler(rotationLeft * Time.deltaTime);
            rb.MoveRotation(rb.rotation * deltaRotationLeft);
        }

    }
}

后来编辑:我问这个问题的原因是我不知道向量car.forward与我写的静态向量不同.在评论中解释后,我不明白我做错了什么.

最佳答案 您可以使用transform.Translate()代替rb.MovePosition().它使用Transform而不是Rigidbody移动一个对象,你也可以重载这个方法,并选择相对于空间或自身移动一个对象,更多
here.这是工作版本

public Rigidbody rb;
public Transform car;
public float speed = 17;


Vector3 rotationRight = new Vector3(0, 30, 0);
Vector3 rotationLeft = new Vector3(0, -30, 0);

Vector3 forward = new Vector3(0, 0, 1);
Vector3 backward = new Vector3(0, 0, -1);

void FixedUpdate()
{
    if (Input.GetKey("w"))
    {
        transform.Translate(forward * speed * Time.deltaTime);
    }
    if (Input.GetKey("s"))
    {
        transform.Translate(backward * speed * Time.deltaTime);
    }

    if (Input.GetKey("d"))
    {
        Quaternion deltaRotationRight = Quaternion.Euler(rotationRight * Time.deltaTime);
        rb.MoveRotation(rb.rotation * deltaRotationRight);
    }

    if (Input.GetKey("a"))
    {
        Quaternion deltaRotationLeft = Quaternion.Euler(rotationLeft * Time.deltaTime);
        rb.MoveRotation(rb.rotation * deltaRotationLeft);
    }

}
点赞