Menu
CoddyTech

Gelombang Berikutnya

Pelajaran 17 dari 18 dalam kursus Game Unity: Tower Defense di Coddy.

Di antara gelombang, pemain membangun, dan hitung mundur menunjukkan waktu yang tersisa. Pemain yang siap dapat memanggil gelombang berikutnya lebih awal dengan sebuah tombol. Jeda ini adalah perulangan dalam coroutine yang melakukan yield null, sehingga dijalankan sekali per frame: perulangan ini menghitung mundur waktu yang tersisa, menampilkannya, lalu berakhir saat waktunya habis atau saat tombol meminta gelombang berikutnya. Tombol hanya mengatur sebuah bool, lalu perulangan membacanya:

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

Bool diatur kembali ke false setelah digunakan, jika tidak, setiap jeda setelah jeda pertama akan langsung berakhir. Mathf.CeilToInt membulatkan ke atas, jadi sisa waktu 2.3 detik akan ditampilkan sebagai 3, dan hitung mundur menampilkan 1 selama satu detik terakhir, bukan 0. Hitung mundur ini merupakan coroutine tersendiri, dan yield return StartCoroutine(Countdown()); menjalankannya lalu menunggu hingga selesai sebelum perulangan gelombang berlanjut.

HUD juga menampilkan nomor gelombang. Spawner mengetahuinya, dan GameManager menampilkannya, jadi spawner memicu event C# bernama WaveStarted, dengan nomor gelombang dan jumlah gelombang. Tidak seperti event static milik musuh, event ini merupakan bagian dari satu spawner, dan GameManager berlangganan melalui field spawner-nya.

challenge icon

Tantangan

Sulit
  1. Di WaveSpawner, tambahkan field berserialisasi countdownText (sebuah TMP_Text) dan nextWaveButton (sebuah GameObject), serta public void CallNextWave(), yang dipanggil oleh tombol untuk meminta gelombang dimulai sekarang.
  2. Ganti penantian sebelum setiap gelombang dengan hitung mundur, jalankan dengan yield return StartCoroutine(Countdown());. Selama hitung mundur berlangsung, tombol ditampilkan dan teks berbunyi Next wave in 8, dengan sisa detik dibulatkan ke atas. Hitung mundur berakhir saat waktunya habis atau tombol diklik, lalu teks dikosongkan dan tombol disembunyikan.
  3. Tambahkan public event Action<int, int> WaveStarted, yang dipicu dengan nomor gelombang (mulai dari 1) dan jumlah gelombang saat sebuah gelombang dimulai.
  4. Di GameManager, tambahkan field berserialisasi spawner (sebuah WaveSpawner) dan waveText (sebuah TMP_Text), berlangganan ke WaveStarted, dan tampilkan Wave 1/8.

HUD memiliki WaveText, CountdownText, dan NextWaveButton. Tekan Mainkan, bangun, lalu mulai gelombang pertama lebih awal, kemudian tekan 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 = 5f;

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

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Game Unity: Tower Defense