Un temporizador de cuenta regresiva
Parte de la sección Creación de juegos reales del Journey de Unity de Coddy. Lección 4 de 60.
Una cuenta regresiva guarda el tiempo restante en un float y le resta Time.deltaTime en cada fotograma. El último fotograma rara vez termina exactamente en 0, así que Mathf.Max lo detiene ahí, y el final debe ocurrir una sola vez. Esta mecha le da al jugador 5 segundos para desactivar una 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 redondea hacia arriba, que es lo que muestra una cuenta regresiva: 5 durante todo el primer segundo (4.99 se redondea a 5), 1 durante el último segundo y 0 solo cuando se acaba el tiempo. (int)fuse reduciría 4.99 a 4 y mostraría 0 durante todo el último segundo mientras la bomba sigue haciendo tic tac; Mathf.RoundToInt mostraría 0 durante la última mitad de segundo. Una cuenta regresiva más larga que se muestra en minutos y segundos sigue la misma regla: primero redondea el tiempo hacia arriba a segundos enteros y luego dale formato.
El return anticipado mantiene BOOM en pantalla: sin él, el siguiente fotograma escribiría Fuse: 0 encima. Un texto también tiene color, y fuseText.color = Color.red lo vuelve rojo.
Desafío
FácilHaz que el parquímetro descuente el tiempo pagado.
- En
Update(), restaTime.deltaTimeatimeLeft, sin bajar de 0, y muestraMathf.CeilToInt(timeLeft)en minutos y segundos:1:15. - La barra espaciadora añade 30 segundos, hasta
maxTime(2:00). - Al llegar a 0, muestra
EXPIREDenColor.red. EmpiezaUpdate()conif (timeLeft == 0f) return;para que se mantenga así.
Pulsa «Jugar» y échale monedas: se detiene en 2:00. Después, pulsa «Comprobar».
Pruébalo tú mismo
using UnityEngine;
using TMPro;
public class ParkingMeter : MonoBehaviour
{
public TMP_Text meterText;
public float timeLeft = 60f;
public float maxTime = 120f;
void Update()
{
// Haz una cuenta regresiva de timeLeft y muéstralo en minutos y segundos; Space añade 30 segundos
}
}
Todas las lecciones de Creación de juegos reales
1Texto en pantalla
Canvas y textoMuestra la puntuaciónDa formato a los númerosUn temporizador de cuenta regresivaRepaso: velocímetro2Botones y pantallas
Botones y onClickLambdasConectar en el InspectorPaneles activados y desactivadosBarras de saludRepaso: tienda de mejoras5Guardar con PlayerPrefs
Guardar un númeroCargar con un valor predeterminadoPuntuación más altaGuardar ajustesRepaso: monedas en el banco3El gestor del juego
Un solo script ejecuta el juegoEl SingletonEstados del juegoActivar el estadoRepaso: gestor de rondas6Proyecto: Corredor sin fin
Tres carrilesObstáculos por delante9El nuevo sistema de entrada
Dos sistemas de entradaTeclado y ratónPulsado en este fotogramaAcciones de entradaRepaso: cambio de entradaPractica por tu cuenta: Playground de Unity