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.
Desafio
DifícilFaça uma contagem regressiva para cada onda; um botão pode iniciá-la antes do tempo.
- Em
WaveSpawner, adicionecountdownText(TMP_Text) enextWaveButton(GameObject) serializados,private bool callNow;epublic void CallNextWave() { callNow = true; }. - Substitua a pausa por
yield return StartCoroutine(Countdown());: mostre o botão e, enquanto ainda houver tempo ecallNownão fortrue, mostreNext wave in 8, arredondado para cima, a cada quadro. - Em seguida, defina
callNownovamente comofalse, 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