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.
Tantangan
SulitHitung mundur sebelum setiap gelombang, tombol dapat memanggilnya lebih awal.
- Di
WaveSpawner, tambahkancountdownText(TMP_Text) dannextWaveButton(GameObject) yang diserialisasi,private bool callNow;danpublic void CallNextWave() { callNow = true; }. - Ganti break dengan
yield return StartCoroutine(Countdown());: tampilkan tombol dan, selama masih ada waktu dancallNowbelum aktif, tampilkanNext wave in 8yang dibulatkan ke atas setiap frame. - Lalu atur kembali
callNowke 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