Menu
CoddyTech

Hitung Mundur

Pelajaran 23 dari 25 dalam kursus Game Unity: Tower Defense di Coddy.

Di antara gelombang, pemain membangun, dan hitung mundur menunjukkan berapa lama waktu yang tersisa. Pemain yang sudah siap dapat memanggil gelombang berikutnya lebih awal dengan tombol. Jeda ini berupa perulangan dalam coroutine yang menghasilkan null, sehingga dijalankan sekali setiap frame: perulangan menghitung mundur waktu, menampilkannya, lalu berakhir saat waktunya habis atau saat tombol meminta gelombang berikutnya. Tombol hanya menetapkan bool, lalu perulangan membacanya:

while (left > 0f && !skipRequested)
{
    // tampilkan sisa detik, hitung mundur, tunggu satu frame
}
skipRequested = false;

Bool kembali menjadi false setelah digunakan, atau setiap jeda setelah yang pertama akan langsung berakhir. Mathf.CeilToInt membulatkan ke atas, jadi 2.3 detik tersisa akan ditampilkan sebagai 3. yield return StartCoroutine(Countdown()); menjalankan hitung mundur dan menunggu sampai selesai.

challenge icon

Tantangan

Sulit

Hitung mundur sebelum setiap gelombang, tombol dapat memanggilnya lebih awal.

  1. Di WaveSpawner, tambahkan countdownText (TMP_Text) dan nextWaveButton (GameObject) yang diserialisasi, private bool callNow; dan public void CallNextWave() { callNow = true; }.
  2. Ganti break dengan yield return StartCoroutine(Countdown());: tampilkan tombol dan, selama masih ada waktu dan callNow belum aktif, tampilkan Next wave in 8 yang dibulatkan ke atas setiap frame.
  3. Lalu atur kembali callNow ke false, kosongkan teks, dan sembunyikan tombol.

Tekan tombol “Main”: Next Wave melewati waktu tunggu. Lalu tekan tombol “Periksa”.

Coba sendiri

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

Semua pelajaran di Game Unity: Tower Defense

Latihan sendiri: Playground Unity