微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

骑自行车时,自行车的运动就像冰一样

如何解决骑自行车时,自行车的运动就像冰一样

每当我转动自行车时,都会感觉好像在滑动。这是脚本

    [Serializefield] float turn;
    [Serializefield] float maxSpeed;
    [Serializefield] GameObject bikeParts;
    [Serializefield] float tilt = 20f;
 
    Rigidbody rb;
    float lastY;

    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }
    void Update()
    {
        float straightMov = Input.GetAxis("Vertical");
        float horizontalMov = Input.GetAxis("Horizontal");


        ControlStraightMov(straightMov);
        ControlWeightTurning(horizontalMov);

        lastY = transform.position.y;
    }

    private void ControlWeightTurning(float horizontalMov)
    {
        Vector3 bikePartsRot = bikeParts.transform.eulerAngles;
        bikePartsRot.x = tilt * horizontalMov;
        bikeParts.transform.eulerAngles = bikePartsRot;

        transform.Rotate(0f,(turn * Time.deltaTime) * horizontalMov,0f);
    }

    private void ControlStraightMov(float straightMov)
    {
        if (straightMov > 0)
        {
            rb.AddRelativeForce((accel * Time.deltaTime) * -straightMov,0f,0f);
        }
        else if (straightMov < 0)
        {
            rb.AddRelativeForce(((accel / 1.3f * Time.deltaTime) * -straightMov),0f);
        }
    }

每当自行车加速时,由于增加的力会使自行车一直沿与自行车面向的方向不同的方向移动,因此很难使自行车转弯,我如何在骑行之前施加该力现在所面对的方向,这样就不会感觉像滑动了吗?

我曾尝试解决此问题,但由于我对团结还很陌生而不能这样做。

解决方法

如何将它以前所面对的力应用到现在所面对的方向上

不确定这种感觉是否正确,但是您可以像例如

private void Update ()
{
    ...

    rb.velocity = transform.forward * rb.velocity.magnitude;
}

将保持当前速度并将其重定向到新的前进方向。


一般说明:每当涉及到Rigidbody时,您都不想通过Transform组件来设置任何操作,而只想通过Rigidbody来设置。

所以你不应该

bikeParts.transform.eulerAngles = bikePartsRot;

transform.Rotate(0f,(turn * Time.deltaTime) * horizontalMov,0f);

,但是两次都计算目标旋转并经过例如FixedUpdate中的rb.MoveRotation

可能看起来像

float horizontalMove;

void Update()
{
    var straightMove = Input.GetAxis("Vertical");
    // Get and store the input in Update
    horizontalMove = Input.GetAxis("Horizontal");

    ControlStraightMov(straightMove);
    
    lastY = transform.position.y;
}

private void FixedUpdate ()
{
    // Handle it in FixedUpdate
    ControlWeightTurning(horizontalMove);
}

private void ControlWeightTurning(float horizontalMove)
{
    var bikePartsRot = bikeParts.transform.eulerAngles;
    bikePartsRot.x = tilt * horizontalMove;

    // Calculate the new final rotation
    var newRotation = Quaternion.Euler(bikePartsRot) * Quaternion.Euler(Vector3.up * (turn * Time.deltaTime) * horizontalMove));

    // Apply it only via the Rigidbody
    rb.MoveRotation(newRotation);
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。