在Unity中实现汽车运动

4
我正在尝试在Unity中制作一款游戏,这个游戏使用了一辆汽车。我想让汽车移动,到目前为止我已经可以让它向前、向后运动,并且我也可以将其向左、向右旋转,这两种移动都很顺利。
但是,当我将其向右旋转后,尝试让其向前移动时,它会以与之前相同的方向移动,而不考虑刚才进行的转弯。它的移动方式就像一侧前进时旋转了。我一直试图调整向前矢量的值,但是我的尝试都没有产生好的结果。如果有人有好的想法,我很愿意听听。
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);
        }

    }
}
< p > < em >稍后编辑:我提出这个问题的原因是我不知道向量 car.forward 与我写的静态向量不同。在评论中的解释后,我理解了自己犯的错误。


在那个问题中,我不明白答案中的代码与问题中的代码有何不同。这是我的第一个Unity项目,我并不真正知道所有事情是如何工作的。我感觉我已经在按照那里写的代码去做了。 - Paul Astalas
你应该使用变换的前向向量而不是0, 0, 1。那是一个静态值。使用 car.forward - Eliasar
@Eliasar,你说得对。我从没想过那些向量实际上是不同的东西。现在它运动起来就像应该的那样。看来今天我学到了一件事。既然这个问题看起来像是重复的,我应该把它删除吗? - Paul Astalas
1个回答

1

您可以使用transform.Translate()代替rb.MovePosition()。它使用Transform移动对象而不是Rigidbody,还可以重载此方法并选择何时相对于空间或自身移动对象,更多信息在这里。这是一个可用的版本。

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);
    }

}

Vector3.Forward与Vector3(0, 0, 1)相同。 - Eliasar
这是可以的,但你不必引入另一个变量。 - flabbet
我之所以这么说是因为它并没有解决问题,它和问题本身一样。 - Eliasar
好的,如果这真的是个问题,我已经将其更改为与问题中相同。 - flabbet
不,问题在于Vector3.Foward不是正确的值。应该使用car.forward代替。这将使汽车沿z方向移动一个单位,而不是指向汽车面部的方向。 - Eliasar
不是的,transform.Translate默认使用车的旋转值。在回答这个问题之前,我已经测试过了。 - flabbet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接