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.
Desafio
FácilFaça o parquímetro fazer a contagem regressiva do tempo pago.
- Em
Update(), subtraiaTime.deltaTimedetimeLeft, sem deixar ficar abaixo de 0, e exibaMathf.CeilToInt(timeLeft)como minutos e segundos:1:15. - A tecla Espaço adiciona 30 segundos, até
maxTime(2:00). - Ao chegar a 0, exiba
EXPIREDemColor.red. ComeceUpdate()comif (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
1Texto na tela
Canvas e textoExiba a pontuaçãoFormate númerosUm cronômetro regressivoRevisão: velocímetro2Botões e telas
Botões e onClickLambdasConectando no InspectorPainéis ligados e desligadosBarras de vidaRevisão: Loja de melhorias5Salvando com PlayerPrefs
Salvar um númeroCarregar com um valor padrãoRecordeSalvar configuraçõesRevisão: Moedas no bancoPratique por conta própria: Playground de Unity