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

В чем разница между Update() и FixedUpdate() в Unity?

1.0 Junior🔥 211 комментариев
#Unity Core#Физика и математика

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

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

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

Разница между Update() и FixedUpdate() в Unity

Основное различие между Update() и FixedUpdate() заключается в частоте вызова и предназначении этих методов в игровом цикле Unity. Это фундаментальное различие влияет на физику, ввод пользователя и общую стабильность симуляции.

Ключевые характеристики Update()

  • Вызывается каждый кадр - частота зависит от FPS (кадров в секунду). При 60 FPS будет вызываться примерно 60 раз в секунду.
  • Нерегулярные интервалы - время между вызовами может варьироваться в зависимости от нагрузки на CPU/GPU.
  • Идеально для:
    • Обработки пользовательского ввода (Input.GetKey(), Input.GetMouseButton())
    • Нефизического движения объектов
    • Логики игры, не связанной с физикой
    • Анимаций и визуальных эффектов
    • Обновления UI
void Update()
{
    // Обработка ввода с клавиатуры
    float horizontal = Input.GetAxis("Horizontal");
    float vertical = Input.GetAxis("Vertical");
    
    // Нефизическое движение (плавное, но зависимое от FPS)
    transform.position += new Vector3(horizontal, 0, vertical) * moveSpeed * Time.deltaTime;
    
    // Вращение мыши (не для физических объектов!)
    float mouseX = Input.GetAxis("Mouse X");
    transform.Rotate(0, mouseX * rotationSpeed * Time.deltaTime, 0);
}

Ключевые характеристики FixedUpdate()

  • Вызывается с фиксированным интервалом - по умолчанию каждые 0.02 секунды (50 раз в секунду)
  • Регулярные интервалы - время между вызовами постоянно (настраивается в Time.fixedDeltaTime)
  • Идеально для:
    • Всей физической симуляции (движение Rigidbody, коллизии, силы)
    • Любых операций, связанных с физическим движком Unity
    • Расчетов, требующих стабильных и предсказуемых интервалов
void FixedUpdate()
{
    // Движение через физический движок
    Rigidbody rb = GetComponent<Rigidbody>();
    float horizontal = Input.GetAxis("Horizontal");
    float vertical = Input.GetAxis("Vertical");
    
    // Применение сил к Rigidbody
    Vector3 force = new Vector3(horizontal, 0, vertical) * moveForce;
    rb.AddForce(force);
    
    // ВСЕ операции с Rigidbody должны быть здесь!
    // rb.MovePosition(), rb.AddTorque(), etc.
}

Практические различия и рекомендации

Time.deltaTime vs Time.fixedDeltaTime

  • В Update() используйте Time.deltaTime для FPS-независимого движения
  • В FixedUpdate() используйте Time.fixedDeltaTime (хотя часто не требуется, так как интервал фиксирован)

Производительность и точность

  • FixedUpdate() гарантирует стабильность физической симуляции, но может вызываться несколько раз за один кадр или не вызываться вообще, если частота кадров очень высока
  • Update() более чувствителен к производительности - при падении FPS логика игры может замедлиться

Важное правило

Никогда не смешивайте физические и нефизические операции! Если объект имеет Rigidbody, все его движение должно управляться в FixedUpdate(). Смешивание подходов приводит к "дрожанию" объектов и нестабильной физике.

Настройка частоты FixedUpdate

Частоту FixedUpdate можно изменить в настройках проекта:

Edit → Project Settings → Time → Fixed Timestep

Уменьшение значения увеличивает точность физики, но требует больше вычислительных ресурсов.

Специальный случай: LateUpdate()

Для полноты картины стоит упомянуть LateUpdate(), который вызывается после всех Update() в кадре, что полезно для камеры, следующей за объектом, или операций, требующих завершения всех обновлений кадра.

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

В чем разница между Update() и FixedUpdate() в Unity? | PrepBro