Menu
CoddyTech

Um cronômetro regressivo

Parte da seção Criando Jogos de Verdade do Journey de Unity da Coddy. Lição 4 de 60.

Uma contagem regressiva mantém o tempo restante em um float e subtrai Time.deltaTime dele a cada quadro. O último quadro raramente chega exatamente a 0, então Mathf.Max o mantém nesse valor, e o fim deve acontecer uma única vez. Esse fusível dá ao jogador 5 segundos para desarmar uma bomba:

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 arredonda para cima, que é o que uma contagem regressiva exibe: 5 durante todo o primeiro segundo (4.99 arredonda para cima para 5), 1 durante o último segundo e 0 somente quando o tempo acaba. (int)fuse cortaria 4.99 para 4 e exibiria 0 durante todo o último segundo enquanto a bomba ainda está apitando; Mathf.RoundToInt exibiria 0 durante a última metade do segundo. Uma contagem regressiva mais longa exibida em minutos e segundos segue a mesma regra: primeiro arredonde o tempo para cima até segundos inteiros e, depois, formate esses valores.

O return antecipado mantém BOOM na tela: sem ele, o quadro seguinte escreveria Fuse: 0 por cima. Um texto também tem uma cor, e fuseText.color = Color.red o deixa vermelho.

challenge icon

Desafio

Fácil

Faça o parquímetro fazer a contagem regressiva do tempo pago.

  1. Em Update(), subtraia Time.deltaTime de timeLeft, sem deixar ficar abaixo de 0, e exiba Mathf.CeilToInt(timeLeft) como minutos e segundos: 1:15.
  2. A tecla Espaço adiciona 30 segundos, até maxTime (2:00).
  3. Ao chegar a 0, exiba EXPIRED em Color.red. Comece Update() com if (timeLeft == 0f) return; para manter esse estado.

Pressione “Jogar” e coloque moedas: o tempo para em 2:00. Em seguida, pressione “Verificar”.

Experimente você mesmo

using UnityEngine;
using TMPro;

public class ParkingMeter : MonoBehaviour
{
    public TMP_Text meterText;
    public float timeLeft = 60f;
    public float maxTime = 120f;

    void Update()
    {
        // Faça a contagem regressiva de timeLeft e exiba o tempo em minutos e segundos; Space adiciona 30 segundos
    }
}

Todas as lições de Criando Jogos de Verdade

Pratique por conta própria: Playground de Unity