Unity C#

Rigidbody.AddForce в Unity C# — добавление силы с примерами кода

Rigidbody.AddForce в Unity — добавление силы к физическому телу. Это основной способ двигать объекты, подчинённые физике: разгон автомобиля, толчок в прыжке, отскок снаряда. В отличие от прямого изменения позиции, сила работает через симуляцию — тело разгоняется, тормозит, сталкивается.

Сигнатура

  • AddForce(Vector3 force) — сила в мировых координатах.
  • AddForce(Vector3 force, ForceMode mode) — с указанием типа силы.
  • Также есть AddRelativeForce (направление относительно осей объекта) и AddForceAtPosition (сила в точке — создаёт вращающий момент).

Как сила применяется — правила из документации

  • Сила прикладывается непрерывно вдоль вектора направления.
  • Эффекты сил накапливаются в момент вызова и применяются физической симуляцией при следующем шаге — после FixedUpdate или при явном вызове симуляции.
  • Силу можно приложить только к активному Rigidbody: у неактивного объекта вызов не даёт эффекта.
  • Rigidbody не должен быть кинематическим — иначе сила игнорируется.
  • По умолчанию после применения силы тело пробуждается, если сила не равна Vector3.zero.

Пример: разгон транспорта

using UnityEngine;

public class CarThrottle : MonoBehaviour
{
    public Rigidbody body;
    public float engineForce = 1200f;
    public float brakeForce = 2500f;

    void FixedUpdate()
    {
        if (Input.GetKey(KeyCode.W))
        {
            // Сила вдоль передней оси машины
            body.AddForce(transform.forward * engineForce);
        }

        if (Input.GetKey(KeyCode.S))
        {
            // Торможение противоположной силой
            body.AddForce(-transform.forward * brakeForce);
        }
    }
}

Сила вызывается в FixedUpdate: эффект накапливается и применяется на ближайшем физическом шаге, так что частота кадров не влияет на поведение.

Режимы силы

ForceMode Что делает Типичное применение
Force Сила по умолчанию, применяется каждый шаг Постоянное ускорение двигателя
Acceleration Ускорение, не зависящее от массы Когда масса тела не должна менять поведение
Impulse Мгновенный толчок Взрыв, выстрел, прыжок в платформере
VelocityChange Прямое изменение скорости без учёта массы Быстрый «игровой» прыжок

Выбор режима меняет итоговое поведение при одинаковом векторе: Impulse даёт резкий толчок «раз и всё», Force — нарастающее воздействие.

Пример: прыжок через импульс

using UnityEngine;

public class Jumper : MonoBehaviour
{
    public Rigidbody body;
    public float jumpImpulse = 6f;

    void Update()
    {
        // Ввод читаем в кадре, но кэшируем для физики
        if (Input.GetKeyDown(KeyCode.Space) && IsGrounded())
        {
            // Мгновенный толчок вверх
            body.AddForce(Vector3.up * jumpImpulse, ForceMode.Impulse);
        }
    }

    bool IsGrounded()
    {
        // Упрощённая проверка: луч вниз от центра
        Vector3 origin = transform.position;
        Vector3 dir = Vector3.down;
        float len = 1.2f;
        return Physics.Raycast(origin, dir, len);
    }
}

Обратите внимание на паттерн: условие прыжка проверяется в Update (чтобы не пропустить короткое нажатие), а сам импульс прикладывается сразу — кэшировать флаг для FixedUpdate в этом случае не нужно, потому что AddForce можно вызвать вне шага: эффект применится на ближайшем шаге.

Частые ошибки

1. AddForce в Update каждый кадр

Вызов каждый кадр при 144 FPS даёт больше импульсов за секунду, чем при 60: поведение зависит от частоты кадров. Постоянные силы прикладывают в FixedUpdate.

3. Кинематический Rigidbody

У тела включен isKinematic — сила молча игнорируется. Проверьте флаг, если «ничего не происходит».

4. Ожидание мгновенной реакции

Сила применяется на следующем физическом шаге. Тело не дёрнется в том же кадре — это нормально.

5. Борьба с физикой через velocity

Документация прямо советует: не изменяйте скорость напрямую для имитации движения — это даёт нереалистичное поведение. Прямое изменение velocity уместно для точечных случаев вроде прыжка из шутера от первого лица.

Связанные статьи