Menu
CoddyTech

Пауза с timeScale

Часть раздела Создание настоящих игр путешествия по Unity на Coddy. Урок 33 из 56.

Time.timeScale определяет скорость игрового времени: 1 — обычная скорость, а 0 останавливает его. При значении 0 Time.deltaTime равен 0, поэтому любое движение, записанное как speed * Time.deltaTime, замирает. FixedUpdate() больше не вызывается, поэтому Rigidbody зависают в воздухе, а WaitForSeconds и Invoke ждут, поскольку они отсчитывают игровое время. Этот скрипт переключает паузу кнопкой, в списке On Click которой вызывается TogglePause, и показывает панель во время паузы:

public class PauseToggle : MonoBehaviour
{
    public GameObject pausePanel;
    bool paused;

    public void TogglePause()
    {
        paused = !paused;
        Time.timeScale = paused ? 0f : 1f;
        pausePanel.SetActive(paused);
    }
}

Останавливается не всё. Update() и LateUpdate() по-прежнему вызываются каждый кадр, при этом Time.deltaTime равен 0; yield return null в корутине по-прежнему возобновляется на следующем кадре, а интерфейс по-прежнему реагирует на нажатия — именно поэтому кнопка может снять паузу. Клавиши тоже считываются: лягушка, которая прыгает при нажатии Space в Update(), обработала бы нажатие во время паузы и подпрыгнула бы на первом физическом шаге после её снятия. Скрипт пропускает обработку клавиш, пока время стоит на месте:

void Update()
{
    if (Time.timeScale == 0f) return;   // пауза: игнорировать нажатия клавиш
    if (Input.GetKeyDown(KeyCode.Space))
    {
        rb.AddForce(Vector3.up * jump, ForceMode.Impulse);
    }
}

Time.timeScale относится ко всей игре, а не к отдельной сцене: если загрузить другую сцену, пока значение равно 0, новая сцена запустится на паузе. Кнопка меню, которая перезапускает уровень или завершает игру, сначала устанавливает значение обратно на 1.

challenge icon

Задание

Средне

Теннисная пушка поворачивается с помощью стрелок влево и вправо и подаёт мяч при нажатии Space (BallMachine.cs). Добавь на корт меню паузы в PauseMenu.cs. В сцене кнопка Пауза связана с Pause(), а кнопка Продолжить, расположенная на скрытой панели PausePanel, — с Resume(); в Inspector панель назначена полю panel.

  • Pause() останавливает игровое время и показывает панель.
  • Resume() возвращает игровое время к нормальной скорости и скрывает панель.
  • В BallMachine.cs нажатие Space не должно подавать мяч, пока игра приостановлена. Поворот менять не нужно: он реализован с помощью Time.deltaTime.

Нажми Играть, подай мяч и приостанови игру, пока мяч в воздухе, затем нажми Проверить.

Попробуйте сами

using UnityEngine;

public class PauseMenu : MonoBehaviour
{
    public GameObject panel;

    public void Pause()
    {
        // Остановить игровое время и показать панель
    }

    public void Resume()
    {
        // Игровое время снова идёт с обычной скоростью, панель скрыта
    }
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Создание настоящих игр