Метод 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.