Menu
CoddyTech

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.

challenge icon

Desafio

Difícil
  1. Em WaveSpawner, adicione os campos serializados countdownText (um TMP_Text) e nextWaveButton (um GameObject), além de public void CallNextWave(), que o botão chama para solicitar a onda agora.
  2. 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 mostra Next 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.
  3. 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.
  4. Em GameManager, adicione os campos serializados spawner (um WaveSpawner) e waveText (um TMP_Text), inscreva-se em WaveStarted e mostre Wave 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");
    }
}
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Jogo de Unity: Defesa de Torres