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

Как MonoBehaviour живёт в 1 кадре в Unity?

1.8 Middle🔥 241 комментариев
#Unity Core

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

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

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

Жизненный цикл MonoBehaviour в одном кадре

Основной цикл выполнения MonoBehaviour в течение одного кадра в Unity — это строго определённая последовательность вызовов событий, управляемых движком. Понимание этого порядка критически важно для написания корректного и предсказуемого кода.

Основная последовательность вызовов в одном кадре

Весь процесс можно разделить на три ключевые фазы: инициализация, обновление состояния и рендеринг.

1. Фаза инициализации и проверок (Execution Order) В самом начале кадра движок обрабатывает скрипты, которые должны выполниться до основной логики.

  • FixedUpdate() (вызывается НЕ каждый визуальный кадр, а с фиксированным шагом по времени Time.fixedDeltaTime). Этот метод связан с физическим движком (PhysX/Box2D) и вызывается перед расчётом физики. Здесь выполняются все операции, связанные с Rigidbody.
    void FixedUpdate() {
        // Корректное место для применения сил (AddForce) и изменения Velocity Rigidbody.
        rigidbody.AddForce(Vector3.forward * 10f);
    }
    
  • Расчёт физики движком: После всех вызовов FixedUpdate() Unity выполняет расчёты столкновений, триггеров и обновляет трансформы объектов через физику.
  • События физики: Сразу после расчёта физики вызываются коллбеки OnTriggerEnter/Stay/Exit() и OnCollisionEnter/Stay/Exit().
    void OnCollisionEnter(Collision collision) {
        // Обработка столкновения, рассчитанного физическим движком в этом кадре.
    }
    

2. Фаза обновления состояния (Game Logic Update) Это ядро игровой логики, привязанное к частоте кадров.

  • Update() — главный метод для обновления логики игры. Вызывается один раз за каждый визуальный кадр. Частота вызовов непостоянна и зависит от производительности (Time.deltaTime).
    void Update() {
        // Ввод игрока, нефизическое движение (Transform.Translate), логика игры.
        float move = Input.GetAxis("Horizontal") * speed * Time.deltaTime;
        transform.Translate(move, 0, 0);
    }
    
  • LateUpdate() — вызывается после всех методов Update() в кадре. Идеальное место для камеры, следящей за объектом, или для логики, требующей завершения вычислений других объектов.
    void LateUpdate() {
        // Камера всегда следует за целью, позиция которой уже обновлена в Update().
        transform.position = target.position + offset;
    }
    

3. Фаза рендеринга (Rendering) После обновления логики начинается процесс визуализации.

  • OnWillRenderObject() и другие GPU-ориентированные коллбеки** вызываются для каждого объекта, который камера собирается отрендерить.
  • Рендеринг движком: Unity отправляет геометрию, материалы и команды в графический конвейер.
  • OnRenderObject(), OnPostRender() — вызовы после завершения рендеринга.

Критически важные нюансы для разработчика

  • Несоответствие частот FixedUpdate и Update: За один визуальный кадр FixedUpdate может быть вызван ноль, один или несколько раз. Это частая причина ошибок при смешивании физики и прямой трансформации.
    // АНТИПАТТЕРН: Смешивание физического и нефизического движения
    void Update() {
        // Неверно! Меняем позицию объекта с Rigidbody напрямую, мешая работе физики.
        // transform.position += ...;
        // Правильно: использовать rigidbody.velocity или forces в FixedUpdate.
    }
    
  • Порядок между скриптами: Методы Update разных MonoBehaviour'ов не имеют гарантированного порядка по умолчанию. Если порядок важен, его нужно задавать в Edit > Project Settings > Script Execution Order.
  • Coroutines (сопрограммы): Их yield инструкции (yield return null, yield return new WaitForFixedUpdate()) встраиваются в этот жизненный цикл. yield return null продолжает выполнение перед следующим Update().
  • Awake() и Start(): Хотя они вызываются один раз при создании объекта, важно помнить, что Awake() вызывается сразу, а Start()перед первым вызовом Update(), но только если скрипт был активен на момент запуска кадра.

Практическое правило для архитектуры

  • Ввод и логика — в Update().
  • Физика и силы — в FixedUpdate().
  • Действия после обновления всех объектов (например, камера) — в LateUpdate().
  • Реакция на события физики — в соответствующих коллбеках (OnCollisionEnter).

Глубокое понимание этого конвейера позволяет избежать тонких багов, связанных с состоянием, физикой и рендерингом, и является основой профессиональной разработки на Unity.

Как MonoBehaviour живёт в 1 кадре в Unity? | PrepBro