Menu
CoddyTech

Contagem regressiva

Lição 23 de 25 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 antes da hora usando um botão. A pausa é um loop em uma coroutine que retorna null, então ela é executada uma vez por quadro: ela faz a contagem regressiva, mostra o tempo 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 volta a ser false depois de ser usado; caso contrário, todas as pausas após a primeira terminariam imediatamente. Mathf.CeilToInt arredonda para cima, então, com 2.3 segundos restantes, a contagem mostra 3. yield return StartCoroutine(Countdown()); executa a contagem regressiva e espera que ela termine.

challenge icon

Desafio

Difícil

Faça uma contagem regressiva para cada onda; um botão pode iniciá-la antes do tempo.

  1. Em WaveSpawner, adicione countdownText (TMP_Text) e nextWaveButton (GameObject) serializados, private bool callNow; e public void CallNextWave() { callNow = true; }.
  2. Substitua a pausa por yield return StartCoroutine(Countdown());: mostre o botão e, enquanto ainda houver tempo e callNow não for true, mostre Next wave in 8, arredondado para cima, a cada quadro.
  3. Em seguida, defina callNow novamente como false, limpe o texto e oculte o botão.

Pressione “Jogar”: Próxima onda pula a espera. Depois, pressione “Verificar”.

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 = 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");
    }
}

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

Pratique por conta própria: Playground de Unity