Таймер обратного отсчёта
Часть раздела Создание настоящих игр путешествия по Unity на Coddy. Урок 4 из 56.
Обратный отсчёт хранит оставшееся время в float и каждый кадр вычитает из него Time.deltaTime. Последний кадр редко заканчивается точно на 0, поэтому Mathf.Max останавливает отсчёт на этом значении, а завершение должно произойти один раз. Этот таймер даёт игроку 5 секунд, чтобы обезвредить бомбу:
public TMP_Text fuseText;
public float fuse = 5f;
private bool exploded;
void Update()
{
if (exploded)
{
return;
}
fuse = Mathf.Max(fuse - Time.deltaTime, 0f);
fuseText.text = "Fuse: " + Mathf.CeilToInt(fuse);
if (fuse == 0f)
{
exploded = true;
fuseText.text = "BOOM";
fuseText.color = Color.red;
}
}Mathf.CeilToInt округляет вверх, как и требуется для обратного отсчёта: 5 в течение всей первой секунды (4.99 округляется до 5), 1 в течение последней секунды и 0 только по истечении времени. (int)fuse округлил бы 4.99 вниз до 4 и показывал бы 0 в течение всей последней секунды, пока бомба ещё тикает; Mathf.RoundToInt показывал бы 0 в течение последней половины секунды. Для более длительного обратного отсчёта, отображаемого в минутах и секундах, действует то же правило: сначала округлите время вверх до целых секунд, а затем отформатируйте результат.
Ранний return оставляет BOOM на экране: без него следующий кадр заменил бы эту надпись на Fuse: 0. У текста также есть цвет, а fuseText.color = Color.red окрашивает его в красный.
Задание
ЛегкоПарковочный счетчик отсчитывает оплаченное время. Напиши его Update() в файле ParkingMeter.cs (сцена связывает его с meterText):
timeLeftначинается с 75 секунд (задай это в Inspector) и уменьшается каждый кадр, но никогда не становится меньше 0.meterTextпоказывает оставшееся время в минутах и секундах, округляя вверх до целых секунд: от 75 до 74.01 секунды отображается1:15, а при 0.4 секунды —0:01.- Нажатие Space добавляет монету: еще 30 секунд, но не больше, чем
maxTime(120, что отображается как2:00). - При 0 отображается текст
EXPIREDкрасным цветом (Color.red). После этого счетчик остается на 0, и монеты больше не добавляют время.
Нажми Play, добавь несколько монет, затем нажми Check.
Попробуйте сами
using UnityEngine;
using TMPro;
public class ParkingMeter : MonoBehaviour
{
public TMP_Text meterText;
public float timeLeft = 60f;
public float maxTime = 120f;
void Update()
{
// Уменьшай timeLeft и отображай оставшееся время в минутах и секундах; Space добавляет 30 секунд
}
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Создание настоящих игр
1Текст на экране
Холст и текстПокажем счётФорматирование чиселТаймер обратного отсчётаПовторение: спидометр4Сцены и уровни
Загрузить сценуПерезапустить уровеньСледующий уровеньСохранить между сценамиПовторение: выбор уровня7Управление временем
Пауза с timeScaleЗамедленное движениеНемасштабируемое времяПовторение: Bullet Time10Проект: 3D-платформер
ТрассаДвижущиеся платформы2Кнопки и экраны
Кнопки и onClickЛямбдыСвязи в InspectorВключение и выключение панелейШкалы здоровьяПовторение: магазин улучшений5Сохранение с помощью PlayerPrefs
Сохранение числаЗагрузка со значением по умолчаниюРекордСохранение настроекПовторение: монеты в банке