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.
Desafío
DifícilCuenta regresiva para cada oleada; un botón la inicia antes.
- En
WaveSpawner, añadecountdownTextserializado (TMP_Text) ynextWaveButton(GameObject),private bool callNow;ypublic void CallNextWave() { callNow = true; }. - Reemplaza la pausa por
yield return StartCoroutine(Countdown());: muestra el botón y, mientras quede tiempo ycallNowno sea verdadero, muestraNext wave in 8, redondeado hacia arriba, en cada fotograma. - Después, vuelve a establecer
callNowen 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