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

Что такое Time.timeScale и для чего он используется?

2.3 Middle🔥 162 комментариев
#C# и ООП

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

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

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

Time.timeScale в Unity

Time.timeScale — это глобальная статическая переменная в Unity, которая контролирует относительную скорость протекания времени в игровом движке. Это один из фундаментальных инструментов для управления временными эффектами в проекте.

Основное назначение и принцип работы

Значение Time.timeScale представляет собой множитель для внутреннего "игрового времени". По умолчанию оно равно 1.0, что соответствует нормальной скорости. Когда вы изменяете этот параметр, происходит масштабирование нескольких ключевых систем:

  • Физика (Physics): Скорость расчетов физического движка изменяется пропорционально.
  • Time.deltaTime: Возвращает время между кадрами, умноженное на Time.timeScale.
  • Анимации: Скорость проигрывания анимаций через Animator или legacy систему.
  • Coroutines: Операции с WaitForSeconds используют масштабированное время.
  • Часть методов Time: Time.fixedDeltaTime также масштабируется, что напрямую влияет на частоту вызова FixedUpdate().

Вот базовый пример изменения времени:

// Нормальная скорость
Time.timeScale = 1f;

// Половина скорости (замедление)
Time.timeScale = 0.5f;

// Двойная скорость (ускорение)
Time.timeScale = 2f;

// Полная остановка (пауза)
Time.timeScale = 0f;

Ключевые сценарии использования

1. Создание эффектов паузы игры Это наиболее распространенное применение. Установка Time.timeScale = 0 эффективно "замораживает" большинство игровых процессов:

public void PauseGame() {
    Time.timeScale = 0f;
    // Дополнительно: отключить звуки, показать UI паузы
}

public void ResumeGame() {
    Time.timeScale = 1f;
}

2. Реализация эффектов замедления или ускорения времени Часто используется в стратегиях, RPG или для спецэффектов (например, "замедление времени" при попадании или особых способностях):

// Эффект "замедления мира" на 3 секунды
public void ActivateSlowMotion() {
    Time.timeScale = 0.3f;
    StartCoroutine(ResetTimeAfterDelay(3f));
}

private IEnumerator ResetTimeAfterDelay(float realTimeDelay) {
    // Используем реальное время, так как WaitForSeconds сейчас тоже замедлен
    yield return new WaitForSecondsRealtime(realTimeDelay);
    Time.timeScale = 1f;
}

3. Синхронизация игровых процессов Позволяет координировать скорость различных систем, чтобы они оставались согласованными при любом масштабе времени.

Важные ограничения и особенности

  • Не влияет на реальное время: Time.unscaledDeltaTime и WaitForSecondsRealtime игнорируют timeScale, что критично для UI-анимаций, таймеров интерфейса или логики меню паузы.
  • Проблемы с физикой при нулевом значении: При Time.timeScale = 0 вызовы FixedUpdate() прекращаются, что может вызвать проблемы с коллайдерами или физическими расчетами. Для сложной паузы часто используют отдельные флаги.
  • Некорректное поведение Input: Некоторые методы ввода (Input.GetKeyDown) могут работать некорректно при измененном времени, требуя использования Input.GetKey в Update.
  • Аддитивные эффекты: Если несколько систем одновременно изменяют timeScale, необходимо аккуратно управлять восстановлением исходного значения.

Альтернативы и лучшие практики

Для более сложных случаев, где требуется независимое управление временем для отдельных объектов (например, замедление только одного персонажа), используют:

  • Локальные множители скорости для анимаций и движения.
  • Кастомные системы временных эффектов, которые не зависят от глобального timeScale.
  • Time.unscaledDeltaTime для всех вычислений, которые должны работать в реальном времени (UI, меню, сетевые таймеры).

Time.timeScale — это мощный, но "грубый" инструмент. Он идеален для глобальных эффектов, но требует осторожности и понимания его воздействия на все подсистемы движка. В профессиональных проектах его часто комбинируют с более тонкими механизмами управления временем для достижения гибкости и стабильности.