Немасштабируемое время
Часть раздела Создание настоящих игр путешествия по Unity на Coddy. Урок 35 из 56.
Даже приостановленной или замедленной игре для некоторых вещей всё ещё нужны реальные часы: меню паузы с анимацией, обратный отсчёт перед продолжением игры, заморозка, которая должна закончиться сама. Time.unscaledDeltaTime — это реальное время с момента последнего кадра независимо от значения Time.timeScale, а Time.unscaledTime — реальное время с момента запуска игры. Это меню паузы вращает индикатор загрузки по реальному времени, поэтому тот продолжает вращаться, пока игра приостановлена:
void Update()
{
wheel.Rotate(0f, 0f, -180f * Time.unscaledDeltaTime); // пол-оборота в секунду, независимо от того, включена пауза или нет
}В корутинах есть такая же пара. WaitForSeconds отсчитывает игровое время, поэтому при Time.timeScale = 0 ожидание никогда не заканчивается; WaitForSecondsRealtime отсчитывает реальные секунды. Эта корутина запускается при открытии меню и мигает заголовком меню каждые полсекунды:
IEnumerator Blink()
{
while (true)
{
title.SetActive(!title.activeSelf);
yield return new WaitForSecondsRealtime(0.5f);
}
}Используй масштабированные значения для игрового процесса, который должен останавливаться вместе с игрой, а немасштабированные — для того, что должно работать, пока игра приостановлена или замедлена: меню, их анимации и таймеры, завершающие паузу. У Invoke нет версии для реального времени: он всегда отсчитывает игровое время.
Задание
СреднеХит-стоп делает сильный удар ощутимым: в момент удара вся игра на мгновение замирает. Стрелки перемещают сбрасыватель, а клавиша Space сбрасывает с него наковальню (Dropper.cs уже готов). Напиши Anvil.cs, который будет у каждой наковальни:
- Когда наковальня во что-либо врезается, заморозь игру:
Time.timeScale— 0. - Через
freezeTimeсекунд реального времени (0.3 в Inspector) снова установи значение 1.
Нажми Play, сбрось несколько наковален, затем нажми Check.
Попробуйте сами
using System.Collections;
using UnityEngine;
public class Anvil : MonoBehaviour
{
public float freezeTime = 0.3f;
// Остановите игру на freezeTime секунд реального времени, когда наковальня ударится обо что-нибудь
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Создание настоящих игр
1Текст на экране
Холст и текстПокажем счётФорматирование чиселТаймер обратного отсчётаПовторение: спидометр4Сцены и уровни
Загрузить сценуПерезапустить уровеньСледующий уровеньСохранить между сценамиПовторение: выбор уровня7Управление временем
Пауза с timeScaleЗамедленное движениеНемасштабируемое времяПовторение: Bullet Time10Проект: 3D-платформер
ТрассаДвижущиеся платформы2Кнопки и экраны
Кнопки и onClickЛямбдыСвязи в InspectorВключение и выключение панелейШкалы здоровьяПовторение: магазин улучшений5Сохранение с помощью PlayerPrefs
Сохранение числаЗагрузка со значением по умолчаниюРекордСохранение настроекПовторение: монеты в банке