Odliczanie
Lekcja 23 z 25 w kursie Gra w Unity: Obrona wieży w Coddy.
Między falami gracz buduje, a odliczanie pokazuje, ile czasu pozostało. Gracz, który jest gotowy, może wcześniej wywołać następną falę, naciskając przycisk. Przerwa to pętla w korutynie, która zwraca null, więc uruchamia się raz na klatkę: odlicza czas, wyświetla go i kończy działanie, gdy czas się skończy lub gdy przycisk wywoła falę. Przycisk tylko ustawia wartość boolowską, a pętla ją odczytuje:
while (left > 0f && !skipRequested)
{
// wyświetl pozostałe sekundy, odliczaj w dół, poczekaj jedną klatkę
}
skipRequested = false;Wartość boolowska wraca do false po użyciu, bo inaczej każda przerwa po pierwszej zakończyłaby się od razu. Mathf.CeilToInt zaokrągla w górę, więc 2,3 sekundy odczytuje się jako 3. yield return StartCoroutine(Countdown()); uruchamia odliczanie i czeka, aż się zakończy.
Wyzwanie
TrudnyOdliczaj czas do każdej fali; przycisk pozwala ją rozpocząć wcześniej.
- W
WaveSpawnerdodaj serializowane polacountdownText(TMP_Text) inextWaveButton(GameObject),private bool callNow;orazpublic void CallNextWave() { callNow = true; }. - Zastąp przerwanie instrukcją
yield return StartCoroutine(Countdown());: pokaż przycisk, a następnie, dopóki pozostał czas icallNownie ma wartości true, wyświetlaj co klatkęNext wave in 8, zaokrąglone w górę. - Następnie ponownie ustaw
callNowna false, wyczyść tekst i ukryj przycisk.
Naciśnij „Graj”: przycisk Next Wave pomija oczekiwanie. Następnie naciśnij „Sprawdź”.
Spróbuj swoich sił
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");
}
}
Wszystkie lekcje w sekcji Gra w Unity: Obrona wieży
Poćwicz samodzielnie: Edytor online Unity