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.
Sfida
Difficile- In
WaveSpawner, aggiungi i campi serializzaticountdownText(un TMP_Text) enextWaveButton(un GameObject), epublic void CallNextWave(), che il pulsante chiama per richiedere subito l'ondata. - 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 mostraNext 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. - 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. - In
GameManager, aggiungi i campi serializzatispawner(un WaveSpawner) ewaveText(un TMP_Text), iscriviti a WaveStarted e mostraWave 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");
}
}
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.