Unity C#

Метод LateUpdate в Unity C# — пост-обновление камеры и логики

LateUpdate в Unity — обновление, которое вызывается каждый кадр после всех Update. Его задача — финальная корректировка: камера, следящая за игроком, позиции интерфейса, догоняющая логика.

Как вызывается

  • Каждый кадр, если компонент включён.
  • После завершения всех функций Update на всех объектах сцены.
  • Для получения времени между вызовами используйте Time.deltaTime.
  • Вызывается до отрисовки кадра.

Именно последний пункт делает LateUpdate полезным: к моменту его вызова все объекты уже заняли итоговые позиции на этот кадр.

Главный пример: камера слежения

Классическая задача — камера повторяет позицию игрока. Сделано в Update, оно отстаёт на кадр: игрок обновился, камера поехала за ним только в следующем кадре, из-за чего видно дрожание.

using UnityEngine;

public class FollowCamera : MonoBehaviour
{
    public Transform target;
    public Vector3 offset = new Vector3(0f, 5f, -8f);

    void LateUpdate()
    {
        if (target == null)
        {
            return;
        }

        // Все объекты уже обновились — камера ставится сразу в итог
        Vector3 desired = target.position + offset;
        transform.position = desired;

        transform.LookAt(target);
    }
}

Порядок гарантирует документация Unity: LateUpdate отрабатывает после Update, поэтому камера «догоняет» игрока в том же кадре, в котором он двигался.

Пример: интерфейс поверх объекта

Индикатор здоровья над врагом, отображение позиции на экране — любая отрисовка «поверх» логики тоже уходит в LateUpdate:

using UnityEngine;

public class HealthBarFollower : MonoBehaviour
{
    public Transform target;
    public float height = 2.2f;

    void LateUpdate()
    {
        if (target != null)
        {
            transform.position = target.position + Vector3.up * height;
        }
    }
}

Где LateUpdate, а где Update

Задача Функция Почему
Движение персонажа по вводу Update Ввод привязан к кадрам
Физика FixedUpdate Постоянный шаг симуляции
Камера, следящая за объектом LateUpdate Нужна итоговая позиция всех объектов
UI, привязанный к объекту LateUpdate Не должен отставать на кадр
Окончательная привязка частей тела после анимации LateUpdate Анимация применяется до рендера

Порядок в кадре целиком

Упрощённо: FixedUpdate (физика, со своей частотой) → Update (логика всех объектов) → LateUpdate (финальные корректировки) → отрисовка. Корутины с WaitForEndOfFrame возобновляются ещё позже — после отрисовки всех камер и интерфейса, о чём рассказывается отдельно.

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

1. Движение игрока в LateUpdate

Если перспективная камера стоит на том же объекте или дублирует его смещение, а движение игрока вынесено в LateUpdate — возникает эффект «хвоста» и дрожания. Логика игрока живёт в Update, камера догоняет в LateUpdate.

2. Проверка на null отсутствует

LateUpdate вызывается каждый кадр даже у объектов, чей target уже уничтожен. Ссылка на уничтоженный Transform не равна настоящему null — используйте Unity-оператор сравнения, он учитывает уничтожение объектов.

3. Дорогие вычисления

LateUpdate не отменяет требований к производительности: он выполняется для каждого включённого компонента. Тяжёлые расчёты переносите в Update с кэшированием, в LateUpdate оставляя только применение результата.

4. Забытый deltaTime

Плавное (интерполяционное) движение камеры в LateUpdate обязано умножаться на Time.deltaTime, иначе скорость будет зависеть от FPS.

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