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.
Tantangan
Sulit- Di
WaveSpawner, tambahkan field berserialisasicountdownText(sebuah TMP_Text) dannextWaveButton(sebuah GameObject), sertapublic void CallNextWave(), yang dipanggil oleh tombol untuk meminta gelombang dimulai sekarang. - Ganti penantian sebelum setiap gelombang dengan hitung mundur, jalankan dengan
yield return StartCoroutine(Countdown());. Selama hitung mundur berlangsung, tombol ditampilkan dan teks berbunyiNext wave in 8, dengan sisa detik dibulatkan ke atas. Hitung mundur berakhir saat waktunya habis atau tombol diklik, lalu teks dikosongkan dan tombol disembunyikan. - Tambahkan
public event Action<int, int> WaveStarted, yang dipicu dengan nomor gelombang (mulai dari 1) dan jumlah gelombang saat sebuah gelombang dimulai. - Di
GameManager, tambahkan field berserialisasispawner(sebuah WaveSpawner) danwaveText(sebuah TMP_Text), berlangganan ke WaveStarted, dan tampilkanWave 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");
}
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.