Как ограничить скорость объекта в Unity?

Столкнулся с постоянным увеличением скорости по оси Z, при попытке задать Constant Forse изменений не происходит.

    public float forwardForse = 2000f;
    public float sidewaysForse = 500f;
    public float maxVelocity = 2000f;

void Update()
    {
       
        rb.AddForce(0, 0, forwardForse * Time.deltaTime);
        if (Input.GetKey("d"))
        {
            rb.AddForce(sidewaysForse * Time.deltaTime, 0, 0);
        }
        if (Input.GetKey("a"))
        {
            rb.AddForce(-sidewaysForse * Time.deltaTime, 0, 0);
        }
        
    }

Ответы (4 шт):

Автор решения: Andrew

так а чего еще ожидать если ты на каждом кадре делаешь AddForce ?

Ну можешь сразу после AddForce сразу сделать проверку на скорость. Вроде

if ( rb.velocity.x > maxVelocityX) {
   rb.velocity = Vector3(maxVelocity, 0, 0);
}
→ Ссылка
Автор решения: Alemkhan Utepkaliev

Тебе необходимо следующее:

Проверить достигает ли твоя скорость предела. Это то что указывается в speed твоего Rigidbody. Найти эту скорость можно через RigidBody.velocity.magnitude

Соответственно теперь проверять является ли скорость больше максимальной? Если да то нормализовать скорость, и умножить на максимальную скорость. В таком варианте при любом движении физическая скорость не будет выше максимальной

if (_rigidBody.velocity.magnitude >= maxVelocity)
{
   _rigidBody.velocity = _rigidBody.velocity.normalized * maxVelocity;
}
→ Ссылка
Автор решения: Terix

Столкнулся с такой же проблемой, помогло добавления сопротивления воздуха(в редакторе, в компоненте Rigidbody переменная Linear Drag или же просто Drag, смотря какая версия Unity). Подберите подходящие числа методом тыка.

→ Ссылка
Автор решения: Роман Принцип

Скорость увеличивается потому что ты применяешь AddForce в Update. Дело в том, что AddForce автоматически срабатывает в методе FixedUpdate. Получается, что у тебя AddForce срабатывает минимум дважды. Сперва в Update, потом к этой силе добавляется автоматическое срабатывание AddForce в FixedUpdate. Поэтому сила увеличивается. Так повторяется каждый цикл, поэтому сила будет всё время расти и скорость будет увеличиваться.

Кстати, если ты поставишь AddForce в FixedUpdate, будет то же самое. Сила будет добавляться — один раз, потому что ты её применяешь в ручную, второй раз автоматически. И скорость будет расти.

Можно задать ограничения на максимальную скорость, как писали выше. Это пригодится, если ты хочешь управлять скоростью, увеличивать её и уменьшать, но чтобы она не выходила за какой-то предел.

Если скорость меняться не будет, можно применить AddForce в Start. Тогда ты один раз задаёшь силу и она автоматически будет применяться каждый FixedUpdate. Сила будет постоянной и скорость тоже будет постоянной.

→ Ссылка