Немасштабируемое время
Часть раздела Создание настоящих игр путешествия по Unity на Coddy. Урок 36 из 60.
Даже в приостановленной или замедленной игре некоторым вещам нужны настоящие часы: анимированному меню паузы, обратному отсчёту перед продолжением игры, заморозке, которая должна закончиться сама по себе. 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 нет версии для реального времени: он всегда отсчитывает игровое время.
Задание
СреднеДобавь наковальне эффект кратковременной остановки: вся игра замирает на мгновение, когда она приземляется.
- В
Anvil.csнапишиIEnumerator HitStop():Time.timeScale = 0f;, затемyield return new WaitForSecondsRealtime(freezeTime);, после чего установи значение обратно на1f. - Напиши
void OnCollisionEnter(Collision collision), который вызываетStartCoroutine(HitStop());.
Нажми «Играть» и сбрасывай наковальни клавишей Space: при каждом приземлении игра замирает на 0.3 секунды. Затем нажми «Проверить».
Попробуйте сами
using System.Collections;
using UnityEngine;
public class Anvil : MonoBehaviour
{
public float freezeTime = 0.3f;
// Заморозить игру на freezeTime секунд реального времени, когда наковальня ударится обо что-нибудь
}
Все уроки раздела Создание настоящих игр
1Текст на экране
Холст и текстПокажем счётФорматирование чиселТаймер обратного отсчётаПовторение: спидометр4Сцены и уровни
Загрузить сценуПерезапустить уровеньСледующий уровеньСохранить между сценамиПовторение: выбор уровня7Управление временем
Пауза с timeScaleЗамедленное движениеНемасштабируемое времяПовторение: Bullet Time2Кнопки и экраны
Кнопки и onClickЛямбдыСвязи в InspectorВключение и выключение панелейШкалы здоровьяПовторение: магазин улучшений5Сохранение с помощью PlayerPrefs
Сохранение числаЗагрузка со значением по умолчаниюРекордСохранение настроекПовторение: монеты в банкеПотренируйтесь самостоятельно: Песочница Unity