Пауза с 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.
Задание
СреднеТеннисная пушка поворачивается с помощью стрелок влево и вправо и подаёт мяч при нажатии 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()
{
// Игровое время снова идёт с обычной скоростью, панель скрыта
}
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Создание настоящих игр
1Текст на экране
Холст и текстПокажем счётФорматирование чиселТаймер обратного отсчётаПовторение: спидометр4Сцены и уровни
Загрузить сценуПерезапустить уровеньСледующий уровеньСохранить между сценамиПовторение: выбор уровня7Управление временем
Пауза с timeScaleЗамедленное движениеНемасштабируемое времяПовторение: Bullet Time10Проект: 3D-платформер
ТрассаДвижущиеся платформы2Кнопки и экраны
Кнопки и onClickЛямбдыСвязи в InspectorВключение и выключение панелейШкалы здоровьяПовторение: магазин улучшений5Сохранение с помощью PlayerPrefs
Сохранение числаЗагрузка со значением по умолчаниюРекордСохранение настроекПовторение: монеты в банке