如何在Unity中设置刚体的最大速度?

3

似乎什么都不起作用,我尝试了几个小时,从谷歌上复制和粘贴“解决方案”,但都没有效果。
更改maxSpeed变量并没有任何作用。对象仍然像巴里·艾伦一样飞过屏幕。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerMovement : MonoBehaviour 
{

    [Range (0, 5)]public int speed;
    public Rigidbody2D rb2D;
    public Vector3 veloc;
    public float maxSpeed;

    void Start () 
    {
        rb2D = GetComponent<Rigidbody2D> ();
        speed = 4;
        maxSpeed = 0.01f;
        veloc = GetComponent <Rigidbody2D>().velocity;
    }

    void Update () 
    {
        if(Input.GetKey(KeyCode.W))
        {
            rb2D.AddForce (Vector3.up * speed);
        }
        if(Input.GetKey(KeyCode.S))
        {
            rb2D.AddForce (-Vector3.up * speed);
        }
        if(Input.GetKey(KeyCode.D))
        {
            rb2D.AddForce (Vector3.right * speed);
        }
        if(Input.GetKey(KeyCode.A))
        {
            rb2D.AddForce (-Vector3.right * speed);
        }
    }
    void FixedUpdate ()
    {
        if(veloc.magnitude > maxSpeed)
        {
            rb2D.velocity = rb2D.velocity.normalized * maxSpeed;
        }
    }
}

“似乎什么都不起作用”,你尝试过调试代码吗?一步一步地进行调试,你会更好地理解它。 - Camilo Terevinto
@CamiloTerevinto 是的,我已经调试了代码。一开始有一些错误,但我已经修复了它们。在这个版本中没有错误,只是速度不断增加。 - Adi
它是否进入了FixedUpdate的if语句?rb2D.velocity.normalized的值是多少?maxSpeed的值是多少? - Camilo Terevinto
好的,我明白了。veloc.magnitude 的值只在 Start 方法中读取,因此它始终为 0。相反,我将其更改为 rb2D.velocity.magnitude,以便随着对象在屏幕上移动而不断更新。 - Adi
这就是我所说的。你应该将其作为答案发布,格式更好,代码更完整 :) - Camilo Terevinto
2个回答

5
抱歉,我只能够进行英文的翻译工作。
void Update() {
rb2D.velocity = Vector3.ClampMagnitude(rb2D.velocity, maxSpeed);
}

1
虽然此代码可以回答问题,但提供关于为什么和/或如何回答问题的额外上下文有助于提高其长期价值。 - Tân

3

我需要睡得更多。如果你遇到了类似的问题,只需在FixedUpdate方法中将veloc.magnitude更改为rb2D.velocity.magnitude即可。当物体达到最大速度时,它会出现“抖动”,但我还没有找到解决办法。

 void Start () 
    {
        rb2D = GetComponent<Rigidbody2D> ();
        speed = 4;
        maxSpeed = 0.01f;
    }

    void Update () 
    {
        if(Input.GetKey(KeyCode.W))
        {
            rb2D.AddForce (Vector3.up * speed);
        }
        if(Input.GetKey(KeyCode.S))
        {
            rb2D.AddForce (-Vector3.up * speed);
        }
        if(Input.GetKey(KeyCode.D))
        {
            rb2D.AddForce (Vector3.right * speed);
        }
        if(Input.GetKey(KeyCode.A))
        {
            rb2D.AddForce (-Vector3.right * speed);
        }
    }

    void FixedUpdate ()
    {
        if(rb2D.velocity.magnitude > maxSpeed)
        {
            rb2D.velocity = rb2D.velocity.normalized * maxSpeed;
        }
    }
}

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