09/07/2025
Los temporizadores son un elemento fundamental en el diseño de videojuegos. Ya sea para una carrera contrarreloj, el enfriamiento de una habilidad o un evento de tiempo limitado, saber cómo implementar una cuenta regresiva es una habilidad esencial para cualquier desarrollador en Unity. Aunque la lógica de contar hacia atrás puede parecer simple, mostrar ese tiempo en un formato familiar para el jugador, como minutos y segundos, presenta sus propios desafíos.

En este artículo, te guiaremos a través de todo el proceso para crear un temporizador de cuenta regresiva robusto y preciso en Unity. Cubriremos desde el script básico hasta el formato de visualización profesional, asegurándonos de que tu temporizador no solo funcione a la perfección, sino que también se vea genial. ¡Vamos a empezar!
La Lógica Fundamental: Contando Hacia Atrás con Time.deltaTime
El corazón de cualquier temporizador en Unity es una variable de tipo float que almacena el tiempo restante. Para que este valor disminuya de manera consistente y precisa, independientemente de la potencia del ordenador o la tasa de fotogramas (FPS) del juego, utilizamos Time.deltaTime. Esta propiedad representa el tiempo en segundos que tardó en completarse el último fotograma.
Al restar Time.deltaTime de nuestra variable de tiempo en cada fotograma a través del método Update(), nos aseguramos de que el temporizador descuente un segundo real por cada segundo que pasa en el mundo real.

El script más básico se vería así:
using UnityEngine; public class Temporizador: MonoBehaviour { public float tiempoRestante = 60; // 60 segundos para empezar void Update() { if (tiempoRestante > 0) { tiempoRestante -= Time.deltaTime; } } } Este código es el punto de partida. Mientras haya tiempo restante, este se irá reduciendo en cada fotograma.
¿Qué Pasa Cuando el Tiempo se Acaba?
Un temporizador no es muy útil si no ocurre nada cuando llega a cero. Necesitamos una forma de ejecutar una acción, como terminar el nivel o mostrar un mensaje de "Game Over". La forma más sencilla es usar una condición else.
if (tiempoRestante > 0) { tiempoRestante -= Time.deltaTime; } else { Debug.Log("¡El tiempo se ha acabado!"); } Sin embargo, esto presenta un problema: el código dentro del bloque else se ejecutará en cada fotograma una vez que el tiempo se haya agotado. Para evitar esto y tener un control más preciso sobre el estado del temporizador (por ejemplo, para poder pausarlo), introducimos una variable booleana.

Esta versión mejorada nos permite iniciar y detener el temporizador a voluntad y garantiza que la acción final se ejecute solo una vez.
using UnityEngine; using UnityEngine.UI; public class Temporizador: MonoBehaviour { public float tiempoRestante = 125; public bool temporizadorCorriendo = false; private void Start() { // Inicia el temporizador automáticamente al empezar temporizadorCorriendo = true; } void Update() { if (temporizadorCorriendo) { if (tiempoRestante > 0) { tiempoRestante -= Time.deltaTime; } else { Debug.Log("¡El tiempo se ha acabado!"); tiempoRestante = 0; temporizadorCorriendo = false; // Detiene el temporizador } } } } Fíjate que también establecemos tiempoRestante = 0; al final. Esto es una buena práctica para evitar que el valor se vuelva negativo y para que la pantalla muestre un "00:00" limpio.

Visualizando el Tiempo: De Float a Minutos y Segundos
Ahora viene la parte más interesante: traducir nuestro valor flotante (por ejemplo, 125.34f) a un formato que el jugador entienda (02:05). Para ello, necesitamos calcular los minutos y los segundos por separado.
- Minutos: Se obtienen dividiendo el tiempo total entre 60. Usamos
Mathf.FloorToInt()para descartar los decimales y obtener un número entero. - Segundos: Para obtener los segundos restantes que no forman un minuto completo, usamos el operador módulo (
%). Esta operación matemática devuelve el resto de una división. Por ejemplo,125 % 60nos da 5.
Es una excelente práctica encapsular esta lógica en su propia función para mantener el código organizado.
void MostrarTiempo(float tiempoParaMostrar) { float minutos = Mathf.FloorToInt(tiempoParaMostrar / 60); float segundos = Mathf.FloorToInt(tiempoParaMostrar % 60); // Aquí irá el código para actualizar el texto en la UI } No olvides llamar a esta función dentro de tu Update(), pasándole la variable tiempoRestante.

DisplayTime(tiempoRestante);
Dando Formato al Texto para una Apariencia Profesional
Para mostrar el tiempo en pantalla, necesitarás un objeto de UI de tipo Texto. Recomendamos usar TextMeshPro, que es el estándar actual en Unity. En tu script, necesitarás una referencia pública a este componente.
Primero, asegúrate de incluir el espacio de nombres de TextMeshPro en la parte superior de tu script:
using TMPro;
Luego, declara la variable pública:
public TextMeshProUGUI textoTiempo;
Para combinar los minutos y los segundos en un solo string con el formato "00:00", la herramienta perfecta es string.Format(). Esta función nos permite construir una cadena de texto insertando variables en lugares específicos y con un formato determinado.

La sintaxis {0:00} significa: "Toma la primera variable (índice 0) y muéstrala como un número de al menos dos dígitos, rellenando con un cero a la izquierda si es necesario".
Nuestra función MostrarTiempo quedaría así:
void MostrarTiempo(float tiempoParaMostrar) { // Un pequeño truco para que la cuenta atrás se sienta más natural // Muestra "1" durante todo el último segundo. if (tiempoParaMostrar < 0) { tiempoParaMostrar = 0; } float minutos = Mathf.FloorToInt(tiempoParaMostrar / 60); float segundos = Mathf.FloorToInt(tiempoParaMostrar % 60); textoTiempo.text = string.Format("{0:00}:{1:00}", minutos, segundos); } ¡No olvides arrastrar tu objeto de texto desde la Jerarquía de la escena al campo "Texto Tiempo" en el Inspector del script!
Tabla Comparativa de Métodos para Temporizadores
Aunque usamos Update(), existen otras formas de manejar el tiempo en Unity. Aquí tienes una rápida comparación:
| Método | Ventajas | Desventajas | Ideal para... |
|---|---|---|---|
| Update() con Time.deltaTime | Preciso, se ejecuta en cada frame, fácil de implementar. | Se ejecuta constantemente, puede ser ineficiente si hay muchos temporizadores. | Temporizadores principales del juego, cuentas regresivas visibles. |
| Corrutinas (Coroutines) | Permite pausas (yield), bueno para secuencias de eventos, más eficiente para esperas largas. | Ligeramente más complejo de gestionar (iniciar, detener, referencias). | Enfriamientos (cooldowns), retrasos entre acciones, eventos secuenciales. |
| Invoke() | Extremadamente simple para ejecutar un método después de un retraso. | Poco flexible, no se pueden pasar parámetros, difícil de cancelar. | Retrasos simples y únicos, como hacer que un enemigo dispare 2 segundos después de ver al jugador. |
Preguntas Frecuentes (FAQ)
- ¿Cómo inicio o detengo el temporizador desde otro script?
- Puedes crear funciones públicas en tu script de temporizador, como
public void IniciarTemporizador() { temporizadorCorriendo = true; }ypublic void DetenerTemporizador() { temporizadorCorriendo = false; }. Luego, desde el otro script, obtén una referencia a tu componente Temporizador y llama a estas funciones. - ¿Por qué es crucial usar Time.deltaTime?
- Si usaras un valor fijo para restar (por ejemplo, 0.02), tu temporizador correría a diferentes velocidades en ordenadores con diferentes tasas de fotogramas (FPS). Un PC más rápido lo haría correr más rápido y uno más lento, más lento.
Time.deltaTimegarantiza que la cuenta atrás sea consistente y se base en el tiempo real. - ¿Puedo adaptar este código para un cronómetro que cuente hacia arriba?
- ¡Absolutamente! Simplemente inicializa tu variable de tiempo en 0 (
float tiempoActual = 0;) y en lugar de restar, sumaTime.deltaTimeen cada fotograma (tiempoActual += Time.deltaTime;). La lógica para mostrar los minutos y segundos es exactamente la misma. - ¿Cómo puedo añadir milisegundos?
- Para mayor precisión, puedes calcular los milisegundos. La lógica sería:
float milisegundos = (tiempoParaMostrar % 1) * 1000;. Luego, actualiza tustring.Formatpara incluirlo:string.Format("{0:00}:{1:00}:{2:000}", minutos, segundos, milisegundos);.
Conclusión
Crear un temporizador de cuenta regresiva en Unity es una tarea que combina lógica de programación fundamental con el manejo de la interfaz de usuario. Al seguir los pasos de esta guía, has aprendido no solo a hacer que el tiempo cuente hacia atrás de manera precisa con Time.deltaTime, sino también a controlar su estado y, lo más importante, a presentarlo al jugador de una manera clara y profesional usando el operador módulo y string.Format. Ahora tienes el poder de controlar el tiempo en tus juegos y añadir una capa extra de desafío y emoción a tus proyectos.
Si quieres conocer otros artículos parecidos a Crea un Temporizador de Cuenta Atrás en Unity puedes visitar la categoría Juegos.
