Menu
CoddyTech

Cuenta regresiva

Lección 23 de 25 del curso Juego de Unity: Defensa de torres de Coddy.

Entre oleadas, el jugador construye y una cuenta regresiva muestra cuánto tiempo queda. Un jugador que esté listo puede llamar a la siguiente oleada antes de tiempo con un botón. La pausa es un bucle en una corrutina que cede null, así que se ejecuta una vez por fotograma: cuenta el tiempo hacia atrás, lo muestra y termina cuando se acaba el tiempo o cuando se pulsa el botón para pedir la oleada. El botón solo establece un bool y el bucle lo lee:

while (left > 0f && !skipRequested)
{
    // muestra los segundos restantes, haz la cuenta regresiva y espera un fotograma
}
skipRequested = false;

El bool vuelve a false después de usarse; de lo contrario, todas las pausas después de la primera terminarían de inmediato. Mathf.CeilToInt redondea hacia arriba, así que si quedan 2.3 segundos, muestra 3. yield return StartCoroutine(Countdown()); ejecuta la cuenta regresiva y espera a que termine.

challenge icon

Desafío

Difícil

Cuenta regresiva para cada oleada; un botón la inicia antes.

  1. En WaveSpawner, añade countdownText serializado (TMP_Text) y nextWaveButton (GameObject), private bool callNow; y public void CallNextWave() { callNow = true; }.
  2. Reemplaza la pausa por yield return StartCoroutine(Countdown());: muestra el botón y, mientras quede tiempo y callNow no sea verdadero, muestra Next wave in 8, redondeado hacia arriba, en cada fotograma.
  3. Después, vuelve a establecer callNow en false, borra el texto y oculta el botón.

Presiona «Jugar»: «Next Wave» omite la espera. Después, «Comprobar».

Pruébalo tú mismo

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class WaveSpawner : MonoBehaviour
{
    [SerializeField] private List<Wave> waves = new List<Wave>();
    [SerializeField] private Transform[] waypoints;
    [SerializeField] private float timeBetweenWaves = 8f;

    void Start()
    {
        StartCoroutine(RunWaves());
    }

    IEnumerator RunWaves()
    {
        for (int i = 0; i < waves.Count; i++)
        {
            yield return new WaitForSeconds(timeBetweenWaves);
            Debug.Log("Wave " + (i + 1));
            Wave wave = waves[i];
            for (int n = 0; n < wave.count; n++)
            {
                Enemy enemy = Instantiate(wave.enemy, waypoints[0].position, Quaternion.identity);
                enemy.waypoints = waypoints;
                yield return new WaitForSeconds(wave.spacing);
            }
        }
        Debug.Log("All waves sent");
    }
}

Todas las lecciones de Juego de Unity: Defensa de torres

Practica por tu cuenta: Playground de Unity