Продолжаем разбор Update.
Вопрос с подвохом: где вызывать такой код — в Update или FixedUpdate?
private void Update()
{
transform.position += Vector3.forward * 10f;
}
Опытные разработчики уже чувствуют проблему
Если оставить код как есть и вызывать его в Update, скорость движения напрямую зависит от FPS:
• 30 FPS → объект едет медленно
• 120 FPS → объект летит быстрее
И FixedUpdate тоже не решение
Кажется логичным перенести код в FixedUpdate, но тут другая проблема: FixedUpdate вызывается реже, чем кадры
• между вызовами нет отрисовки
• визуально движение становится дёрганным
Решение — использовать Time.deltaTime
Нам нужно учитывать время между кадрами. Time.deltaTime — это количество секунд, прошедших с предыдущего кадра до текущего.
• Кадр 1 выполнился → прошло 0.008 секунд → Кадр 2 начался → Time.deltaTime = 0.008
Исправляем код:
private void Update()
{
transform.position += Vector3.forward * 10f * Time.deltaTime;
}
Теперь:
• скорость одинакова при любом FPS
• движение плавное
🤔 Тогда зачем вообще FixedUpdate?
Логичный вопрос:
если есть Time.deltaTime, зачем нужен FixedUpdate?
Коротко:
• Update — визуал и логика
• FixedUpdate — физика
Почему так:
Update вызывается между физическими тиками, он не синхронизирован с физическим движком
FixedUpdate вызывается строго перед физическим шагом
Последовательность такая:
1. FixedUpdate у всех объектов
2. Unity считает физику
• коллизии
• силы
• OnCollisionEnter, OnTriggerEnter и т.д.
Если считать физику в Update (даже с Time.deltaTime), начинаются проблемы:
• туннелирование (объект «пролетает» сквозь коллайдеры)
• нестабильное и непредсказуемое поведение
Итог
Плавное движение, позиция, визуал → Update + Time.deltaTime
Физика, Rigidbody, силы, коллизии → FixedUpdate
🚀 Пост Guru Unity: @Minerope
