Menu
CoddyTech

Пауза с timeScale

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

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

Задание

Средне

Добавьте в теннисный корт меню паузы. В сцене настроены кнопки «Пауза» и «Продолжить».

  1. В PauseMenu.cs метод Pause() задаёт Time.timeScale = 0f; и вызывает panel.SetActive(true);.
  2. Метод Resume() задаёт Time.timeScale = 1f; и вызывает panel.SetActive(false);.
  3. В BallMachine.cs добавьте if (Time.timeScale == 0f) return; перед проверкой нажатия пробела в Update().

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

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

using UnityEngine;

public class PauseMenu : MonoBehaviour
{
    public GameObject panel;

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

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

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

Потренируйтесь самостоятельно: Песочница Unity