Próxima Onda
Lição 17 de 18 do curso Jogo de Unity: Defesa de Torres da Coddy.
Entre as ondas, o jogador constrói, e uma contagem regressiva mostra quanto tempo resta. Um jogador que estiver pronto pode chamar a próxima onda mais cedo com um botão. O intervalo é um loop em uma coroutine que retorna null, então ele é executado uma vez por quadro: faz a contagem regressiva do tempo restante, exibe-o e termina quando o tempo acaba ou quando o botão solicita a onda. O botão apenas define um bool, e o loop o lê:
while (left > 0f && !skipRequested)
{
// mostre os segundos restantes, faça a contagem regressiva, aguarde um quadro
}
skipRequested = false;O bool é definido novamente como false depois de ser usado, ou todos os intervalos depois do primeiro terminariam imediatamente. Mathf.CeilToInt arredonda para cima, então 2.3 segundos restantes são exibidos como 3, e a contagem regressiva mostra 1 durante todo o último segundo, em vez de 0. A contagem regressiva é uma coroutine própria, e yield return StartCoroutine(Countdown()); a executa e espera que ela termine antes de o loop das ondas continuar.
O HUD também mostra o número da onda. O spawner sabe qual é, e o GameManager a exibe, então o spawner dispara um evento C#, WaveStarted, com a onda e o número de ondas. Ao contrário dos eventos estáticos dos inimigos, ele pertence ao único spawner, e o GameManager se inscreve por meio do campo spawner.
Desafio
Difícil- Em
WaveSpawner, adicione os campos serializadoscountdownText(um TMP_Text) enextWaveButton(um GameObject), além depublic void CallNextWave(), que o botão chama para solicitar a onda agora. - Substitua a espera antes de cada onda por uma contagem regressiva, executada com
yield return StartCoroutine(Countdown());. Enquanto ela estiver em andamento, o botão fica visível e o texto mostraNext wave in 8, com os segundos restantes arredondados para cima. Ela termina quando o tempo acaba ou quando o botão é clicado; então, o texto fica vazio e o botão é ocultado. - Adicione
public event Action<int, int> WaveStarted, acionado quando uma onda começa com o número da onda (a partir de 1) e o número total de ondas. - Em
GameManager, adicione os campos serializadosspawner(um WaveSpawner) ewaveText(um TMP_Text), inscreva-se em WaveStarted e mostreWave 1/8.
O HUD tem o WaveText, o CountdownText e o NextWaveButton. Pressione Play, construa e chame a primeira onda antecipadamente; depois, clique em Check.
Experimente você mesmo
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");
}
}
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.