Menu
CoddyTech

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.

challenge icon

Sfida

Difficile

Conta alla rovescia prima di ogni ondata; un pulsante la avvia in anticipo.

  1. In WaveSpawner, aggiungi countdownText serializzato (TMP_Text) e nextWaveButton (GameObject), private bool callNow; e public void CallNextWave() { callNow = true; }.
  2. Sostituisci l’interruzione con yield return StartCoroutine(Countdown());: mostra il pulsante e, finché resta del tempo e callNow non è true, mostra Next wave in 8, arrotondato per eccesso, a ogni frame.
  3. Poi reimposta callNow su 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