Пауза с 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.
Задание
СреднеДобавьте в теннисный корт меню паузы. В сцене настроены кнопки «Пауза» и «Продолжить».
- В
PauseMenu.csметодPause()задаётTime.timeScale = 0f;и вызываетpanel.SetActive(true);. - Метод
Resume()задаётTime.timeScale = 1f;и вызываетpanel.SetActive(false);. - В
BallMachine.csдобавьтеif (Time.timeScale == 0f) return;перед проверкой нажатия пробела вUpdate().
Нажмите «Играть», подайте мяч и поставьте игру на паузу: мяч зависнет в воздухе. Затем нажмите «Проверить».
Попробуйте сами
using UnityEngine;
public class PauseMenu : MonoBehaviour
{
public GameObject panel;
public void Pause()
{
// Остановить игровое время и показать панель
}
public void Resume()
{
// Игровое время снова идёт с обычной скоростью, панель скрыта
}
}
Все уроки раздела Создание настоящих игр
1Текст на экране
Холст и текстПокажем счётФорматирование чиселТаймер обратного отсчётаПовторение: спидометр4Сцены и уровни
Загрузить сценуПерезапустить уровеньСледующий уровеньСохранить между сценамиПовторение: выбор уровня7Управление временем
Пауза с timeScaleЗамедленное движениеНемасштабируемое времяПовторение: Bullet Time2Кнопки и экраны
Кнопки и onClickЛямбдыСвязи в InspectorВключение и выключение панелейШкалы здоровьяПовторение: магазин улучшений5Сохранение с помощью PlayerPrefs
Сохранение числаЗагрузка со значением по умолчаниюРекордСохранение настроекПовторение: монеты в банкеПотренируйтесь самостоятельно: Песочница Unity