Conto alla rovescia
Lezione 23 di 25 del corso Gioco Unity: Tower Defense di Coddy.
Tra un'ondata e l'altra il giocatore costruisce, mentre un conto alla rovescia mostra quanto tempo rimane. Un giocatore pronto può chiamare in anticipo l'ondata successiva con un pulsante. La pausa è un ciclo in una coroutine che restituisce null, quindi viene eseguito una volta per frame: fa il conto alla rovescia, lo mostra e termina quando il tempo è scaduto o quando il pulsante ha richiesto l'ondata. Il pulsante imposta solo un bool e il ciclo lo legge:
while (left > 0f && !skipRequested)
{
// mostra i secondi rimanenti, esegui il conto alla rovescia, attendi un frame
}
skipRequested = false;Il bool torna a false dopo essere stato usato, altrimenti ogni pausa successiva alla prima terminerebbe subito. Mathf.CeilToInt arrotonda per eccesso, quindi 2,3 secondi rimanenti vengono mostrati come 3. yield return StartCoroutine(Countdown()); esegue il conto alla rovescia e attende che finisca.
Sfida
DifficileConta alla rovescia prima di ogni ondata; un pulsante la avvia in anticipo.
- In
WaveSpawner, aggiungicountdownTextserializzato (TMP_Text) enextWaveButton(GameObject),private bool callNow;epublic void CallNextWave() { callNow = true; }. - Sostituisci l’interruzione con
yield return StartCoroutine(Countdown());: mostra il pulsante e, finché resta del tempo ecallNownon è true, mostraNext wave in 8, arrotondato per eccesso, a ogni frame. - Poi reimposta
callNowsu false, cancella il testo e nascondi il pulsante.
Premi «Gioca»: Next Wave salta l’attesa. Poi premi «Verifica».
Provalo tu
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");
}
}
Tutte le lezioni di Gioco Unity: Tower Defense
Esercitati da solo: Playground Unity