Menu
CoddyTech

Prossima ondata

Lezione 17 di 18 del corso Gioco Unity: difesa della torre di Coddy.

Tra un'ondata e l'altra, il giocatore costruisce e un conto alla rovescia mostra quanto tempo resta. Un giocatore pronto può avviare 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 del tempo rimanente, 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 viene reimpostato su false dopo essere stato usato, altrimenti ogni pausa dopo la prima terminerebbe subito. Mathf.CeilToInt arrotonda per eccesso, quindi 2.3 secondi rimanenti vengono mostrati come 3 e il conto alla rovescia indica 1 per tutto l'ultimo secondo, invece di 0. Il conto alla rovescia è una coroutine a sé stante e yield return StartCoroutine(Countdown()); la esegue e ne attende il completamento prima che il ciclo delle ondate prosegua.

L'HUD mostra anche il numero dell'ondata. Lo spawner lo conosce e GameManager lo visualizza, quindi lo spawner genera un evento C#, WaveStarted, con l'ondata e il numero di ondate. A differenza degli eventi statici dei nemici, appartiene a un singolo spawner e GameManager si iscrive tramite il suo campo spawner.

challenge icon

Sfida

Difficile
  1. In WaveSpawner, aggiungi i campi serializzati countdownText (un TMP_Text) e nextWaveButton (un GameObject), e public void CallNextWave(), che il pulsante chiama per richiedere subito l'ondata.
  2. Sostituisci l'attesa prima di ogni ondata con un conto alla rovescia, eseguito con yield return StartCoroutine(Countdown());. Mentre è in corso, il pulsante è visibile e il testo mostra Next wave in 8, con i secondi rimanenti arrotondati per eccesso. Termina quando il tempo è scaduto o è stato cliccato il pulsante; quindi il testo è vuoto e il pulsante è nascosto.
  3. Aggiungi public event Action<int, int> WaveStarted, attivato quando inizia un'ondata, con il numero dell'ondata (a partire da 1) e il numero totale di ondate.
  4. In GameManager, aggiungi i campi serializzati spawner (un WaveSpawner) e waveText (un TMP_Text), iscriviti a WaveStarted e mostra Wave 1/8.

L'HUD contiene WaveText, CountdownText e NextWaveButton. Premi Play, costruisci e avvia in anticipo la prima ondata, poi premi Check.

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 = 5f;

    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");
    }
}
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Gioco Unity: difesa della torre