Menu
CoddyTech

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.

challenge icon

Wyzwanie

Trudny

Odliczaj czas do każdej fali; przycisk pozwala ją rozpocząć wcześniej.

  1. W WaveSpawner dodaj serializowane pola countdownText (TMP_Text) i nextWaveButton (GameObject), private bool callNow; oraz public void CallNextWave() { callNow = true; }.
  2. Zastąp przerwanie instrukcją yield return StartCoroutine(Countdown());: pokaż przycisk, a następnie, dopóki pozostał czas i callNow nie ma wartości true, wyświetlaj co klatkę Next wave in 8, zaokrąglone w górę.
  3. Następnie ponownie ustaw callNow na 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