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 уместно для точечных случаев вроде прыжка из шутера от первого лица.