Таймер обратного отсчёта
Часть раздела Создание настоящих игр путешествия по Unity на Coddy. Урок 4 из 60.
Обратный отсчёт хранит оставшееся время в 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()вычитайTime.deltaTimeизtimeLeft, не позволяя значению стать меньше 0, и отображайMathf.CeilToInt(timeLeft)в минутах и секундах:1:15. - Нажатие пробела добавляет 30 секунд, но не больше
maxTime(2:00). - При значении 0 отображай
EXPIREDцветомColor.red. НачниUpdate()сif (timeLeft == 0f) return;, чтобы значение не менялось.
Нажми «Играть» и пополняй счёт монетами: значение остановится на 2:00. Затем нажми «Проверить».
Попробуйте сами
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Сцены и уровни
Загрузить сценуПерезапустить уровеньСледующий уровеньСохранить между сценамиПовторение: выбор уровня2Кнопки и экраны
Кнопки и onClickЛямбдыСвязи в InspectorВключение и выключение панелейШкалы здоровьяПовторение: магазин улучшений5Сохранение с помощью PlayerPrefs
Сохранение числаЗагрузка со значением по умолчаниюРекордСохранение настроекПовторение: монеты в банкеПотренируйтесь самостоятельно: Песочница Unity