Menu
CoddyTech

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

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

challenge icon

Задание

Легко

Сделай так, чтобы паркомат отсчитывал оплаченное время.

  1. В Update() вычитай Time.deltaTime из timeLeft, не позволяя значению стать меньше 0, и отображай Mathf.CeilToInt(timeLeft) в минутах и секундах: 1:15.
  2. Нажатие пробела добавляет 30 секунд, но не больше maxTime (2:00).
  3. При значении 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 секунд
    }
}

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

Потренируйтесь самостоятельно: Песочница Unity