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

Что такое Time.deltaTime?

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

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

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

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

Time.deltaTime в Unity

Time.deltaTime — это одно из фундаментальных свойств в Unity, представляющее время в секундах, прошедшее с момента завершения последнего кадра (или, точнее, с последнего вызова метода Update()). Это значение является ключевым для создания плавного, независимого от частоты кадров (frame-rate independent) движения и анимации.

Зачем это нужно?

Без deltaTime скорость игровых объектов напрямую зависела бы от производительности. На мощном ПК с 120 FPS объект двигался бы в два раза быстрее, чем на слабом с 60 FPS, так как функция Update() вызывалась бы чаще.

Пример проблемы БЕЗ deltaTime:

void Update() {
    // Плохо: движение зависит от FPS
    transform.position += Vector3.forward * 10; // За кадр
}

На 60 FPS объект пройдет 10 * 60 = 600 единиц в секунду. На 120 FPS — уже 10 * 120 = 1200 единиц. Это неприемлемо.

Решение С deltaTime:

void Update() {
    // Хорошо: движение независимо от FPS
    float speed = 10f; // Единиц в СЕКУНДУ
    transform.position += Vector3.forward * speed * Time.deltaTime;
}

Теперь, независимо от FPS, объект будет двигаться со скоростью 10 единиц в секунду, потому что deltaTime на 60 FPS равен ~0.0167с, а на 120 FPS — ~0.0083с. Расчет: 10 * 0.0167 ≈ 0.167 единиц за кадр на 60 FPS и 10 * 0.0083 ≈ 0.083 на 120 FPS, что в итоге за секунду дает одно и то же значение.

Технические детали и нюансы

  • Тип данных: float. Всегда положительное значение (кроме ручной настройки в редакторе, что не рекомендуется).

  • Источник значения: Рассчитывается движком как разница во времени между двумя последовательными кадрами.

  • Связь с FixedUpdate: В методе FixedUpdate(), который вызывается с фиксированной частотой (по умолчанию 50 раз в секунду), Time.deltaTime равен константному значению Time.fixedDeltaTime (по умолчанию 0.02с). Использование Time.deltaTime внутри FixedUpdate обычно избыточно, так как физика и так привязана к фиксированному шагу.

    void FixedUpdate() {
        // Здесь Time.deltaTime == Time.fixedDeltaTime
        rigidbody.AddForce(Vector3.up * 10 * Time.fixedDeltaTime);
    }
    
  • Time.unscaledDeltaTime: Важная альтернатива. Показывает "реальное" время между кадрами, игнорируя масштаб времени (Time.timeScale). Критически важно использовать для логики UI, меню-пауз или эффектов, которые должны продолжаться, даже когда игровое время замедлено или остановлено.

    void Update() {
        // Анимация будет работать даже при Time.timeScale = 0 (игра на паузе)
        pauseMenuAnimationProgress += animSpeed * Time.unscaledDeltaTime;
    }
    

Практические сценарии использования

  • Перемещение и поворот:
    transform.Translate(moveDirection * speed * Time.deltaTime);
    transform.Rotate(0, rotationSpeed * Time.deltaTime, 0);
    
  • Плавные интерполяции (Lerp): Для плавного изменения значения за время.
    currentHealth = Mathf.Lerp(currentHealth, targetHealth, healRate * Time.deltaTime);
    
  • Таймеры и кд (cooldown):
    if (attackCooldown > 0) {
        attackCooldown -= Time.deltaTime; // Таймер уменьшается на реальное время
    }
    
  • Управление анимациями (не через Animator):
    material.SetFloat("_Cutoff", Mathf.PingPong(Time.time * speed, 1.0f));
    

Важные предупреждения

  1. Не используйте в FixedUpdate для физики. Для сил и перемещения Rigidbody используйте Time.fixedDeltaTime или, что чаще, обходитесь без него, так как физический шаг и так фиксирован.
  2. При нулевом Time.timeScale. Time.deltaTime также станет равен нулю. Вся логика в Update(), зависящая от него, остановится. Для логики, работающей в паузе, переключайтесь на Time.unscaledDeltaTime.
  3. В первом кадре. Time.deltaTime может быть нестабильным (обычно чуть больше), так как включает время запуска сцены. Для очень точных измерений это можно учесть.

Итог: Time.deltaTime — это мост между игровыми кадрами и реальным временем. Его корректное использование — признак понимания основ игрового цикла и обязательное условие создания стабильного и предсказуемого игрового процесса на любом оборудовании. Всегда задавайте скорости в единицах в секунду и умножайте их на deltaTime внутри Update().