← Назад к вопросам

Что такое Rigidbody в Unity и для чего он нужен?

3.0 Senior🔥 82 комментариев
#Unity Core

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI7 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое Rigidbody в Unity?

Rigidbody (жесткое тело) — это один из фундаментальных компонентов физического движка PhysX, интегрированного в Unity. Его основное предназначение — наделить GameObject (игровой объект) свойствами физического тела, позволив движку автоматически рассчитывать его поведение согласно законам классической механики. Без Rigidbody объект считается «статичным» и не подверженным влиянию физики.

Для чего он нужен? Основные функции

Ключевые функции Rigidbody можно разделить на несколько категорий:

1. Симуляция физики движения

Компонент автоматически рассчитывает:

  • Прямолинейное движение (velocity) и вращение (angularVelocity) под действием сил.
  • Массу (mass) объекта, которая влияет на его инерцию и взаимодействие с другими телами.
  • Сопротивление (drag и angularDrag) — силы, замедляющие движение и вращение, имитируя трение о среду.
  • Гравитацию — объект автоматически падает, если включена опция useGravity.

2. Взаимодействие с силами и импульсами

Через скрипты можно воздействовать на объект, применяя:

  • Постоянные силы (AddForce) — например, для движения автомобиля.
  • Мгновенные импульсы (AddImpulse) — например, для выстрела или прыжка.
  • Вращающие силы (AddTorque) — для вращения объекта.

3. Реагирование на столкновения и триггеры

Rigidbody является необходимым условием для корректной обработки событий:

  • OnCollisionEnter(Collision collision) — при физическом столкновении с другим коллайдером, у которого тоже есть Rigidbody (или он статичен).
  • OnTriggerEnter(Collider other) — при входе в зону триггер-коллайдера.

Типы Rigidbody и их свойства

В Unity существуют три основных типа Rigidbody, управляемых через свойство Body Type:

  • Dynamic (Динамический): Полноценное физическое тело. Полностью подвержено силам, гравитации и столкновениям. Это самый распространенный тип для подвижных объектов (персонажи, снаряды, ящики).
  • Kinematic (Кинематический): Тело, которым управляет не физика, а код (через transform.position). Оно само не движется под действием сил, но может толкать Dynamic тела при столкновении. Используется для платформ, двигающихся по пути, или персонажей, управляемых анимацией.
  • Static (Статический): Тело без Rigidbody, но с коллайдером. Неподвижно и не реагирует на силы. Оптимизировано для уровня (стены, пол). Важно: менять transform у Static объекта во время выполнения — антипаттерн, ведущий к ошибкам.

Пример использования в коде

using UnityEngine;

public class PlayerMovement : MonoBehaviour
{
    public float moveSpeed = 10f;
    public float jumpForce = 5f;

    private Rigidbody rb;
    private bool isGrounded;

    void Start()
    {
        // Получаем ссылку на компонент Rigidbody
        rb = GetComponent<Rigidbody>();
    }

    void Update()
    {
        // Обработка прыжка через Input в Update
        if (Input.GetKeyDown(KeyCode.Space) && isGrounded)
        {
            // Применяем импульс вверх для прыжка
            rb.AddForce(Vector3.up * jumpForce, ForceMode.Impulse);
            isGrounded = false;
        }
    }

    void FixedUpdate()
    {
        // Все физические расчеты выполняем в FixedUpdate!
        float moveHorizontal = Input.GetAxis("Horizontal");
        float moveVertical = Input.GetAxis("Vertical");

        Vector3 movement = new Vector3(moveHorizontal, 0.0f, moveVertical);
        
        // Применяем постоянную силу для движения
        rb.AddForce(movement * moveSpeed);
    }

    void OnCollisionEnter(Collision collision)
    {
        // Проверяем, коснулись ли мы поверхности, от которой можно оттолкнуться
        if (collision.gameObject.CompareTag("Ground"))
        {
            isGrounded = true;
        }
    }
}

Важные аспекты и лучшие практики

  • FixedUpdate vs Update: Все манипуляции с Rigidbody (силы, изменение скорости) должны выполняться в методе FixedUpdate, который вызывается с фиксированным интервалом, синхронно с обновлением физического движка.
  • Не смешивать подходы: Избегайте одновременного изменения transform.position и использования AddForce для Dynamic тела — это приводит к нестабильной симуляции. Используйте либо физику (силы), либо прямое перемещение (для Kinematic тел).
  • Изометрия (isKinematic flag): Булево свойство, позволяющее временно переключать Dynamic тело в режим, управляемый кодом, что полезно для cut-scene или анимаций.
  • Интерполяция (Interpolate) и Экстраполяция (Extrapolate): Настройки, сглаживающие движение физического объекта между кадрами FixedUpdate для визуально плавной анимации на частоте рендеринга.

Таким образом, Rigidbody — это центральный компонент для создания любого интерактивного, динамичного и реалистичного поведения объектов в игровом мире Unity, абстрагирующий разработчика от ручного расчета сложных физических взаимодействий.