Menu
CoddyTech

Таймер обратного отсчёта

Часть раздела Создание настоящих игр путешествия по 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 окрашивает его в красный.

challenge icon

Задание

Легко

Парковочный счетчик отсчитывает оплаченное время. Напиши его 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 секунд
    }
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Создание настоящих игр