Sesuaikan dengan Gayamu
Pelajaran 18 dari 18 dalam kursus Game Unity: Tower Defense di Coddy.
Game ini membutuhkan kondisi akhir. Game kalah ketika jumlah nyawa mencapai 0, dan menang ketika semua gelombang sudah dikirim dan tidak ada musuh yang tersisa di papan. Spawner mengetahui kapan gelombang terakhir sudah keluar, dan Enemy.All mengetahui jumlah musuh yang tersisa, jadi spawner menunggu sampai papan kosong lalu memicu event yang didengarkan oleh GameManager. Coroutine menunggu kondisi dengan WaitUntil, yang memeriksa lambda sekali per frame. Contoh ruang teka-teki yang membuka pintu keluarnya setelah semua sakelar aktif:
yield return new WaitUntil(() => switchesOn == switches.Length);
exit.SetActive(true);Kedua kondisi akhir menampilkan EndPanel dengan pesan dan menghentikan game menggunakan Time.timeScale = 0. Jumlah nyawa tidak pernah kurang dari 0: Tank yang menerima 2 damage saat tersisa 1 nyawa akan melewati pemeriksaan untuk nilai tepat 0, jadi Mathf.Max menjaga jumlahnya tetap 0 atau lebih.
Play Again memuat scene lagi. Time.timeScale bukan bagian dari scene dan nilainya tetap sama saat scene dimuat, jadi game yang dihentikan pada 0 akan dimulai lagi dalam keadaan beku: atur kembali ke 1 sebelum memuat scene.
Lalu buat game ini menjadi milikmu. Semua pengaturan untuk menyeimbangkannya ada di Inspector:
- GameManager milik game:
startMoney(150) danstartLives(20). wavesmilik Spawner, delapan baris yang berisi musuh, jumlah, dan jarak, sertatimeBetweenWaves(8).- Aset EnemyData: kecepatan, health, hadiah, dan jumlah nyawa yang diambil oleh setiap jenis musuh. Boss memiliki 450 health dan mengambil 10 nyawa.
- Aset TowerData: biaya, damage, jangkauan, laju tembakan, angka peningkatan, efek splash Cannon, dan efek perlambatan menara Frost.
Angka bawaan dapat dikalahkan dengan pertahanan campuran di tikungan jalur, lalu ditingkatkan seiring bertambahnya uang; beberapa menara dari satu jenis saja tidak akan mampu bertahan. Ubah satu angka setiap kali, lalu mainkan game untuk merasakan pengaruhnya.
Tantangan
Sulit- Di
WaveSpawner, tambahkanpublic event Action AllWavesCleared. Setelah wave terakhir dikirim, tunggu hinggaEnemy.Allkosong, lalu aktifkan event tersebut. - Di
GameManager, tambahkan field berseriendPanel(sebuah GameObject) danendText(sebuah TMP_Text). Nyawa tidak pernah kurang dari 0, dan saat mencapai 0, permainan berakhir denganGame Over. Saat semua wave berhasil dilewati dan masih ada nyawa, permainan berakhir denganYou Win!. Saat permainan berakhir, tampilkan panel dengan pesannya dan aturTime.timeScaleke 0. - Tulis
public void PlayAgain(), yang dipanggil oleh tombol pada panel: kembalikan waktu ke normal, lalu muat kembali scene yang aktif.
Tekan Play dan pertahankan markas dari semua delapan wave, lalu tekan Check. Setelah itu, sesuaikan permainan di Inspector dan mainkan sesuai keinginanmu.
Coba sendiri
using UnityEngine;
using TMPro;
public class GameManager : MonoBehaviour
{
[SerializeField] private int startMoney = 100;
[SerializeField] private int startLives = 20;
[SerializeField] private WaveSpawner spawner;
[SerializeField] private TMP_Text moneyText;
[SerializeField] private TMP_Text livesText;
[SerializeField] private TMP_Text waveText;
private int money;
private int lives;
void OnEnable()
{
Enemy.ReachedBase += OnReachedBase;
Enemy.Killed += OnKilled;
spawner.WaveStarted += ShowWave;
}
void OnDisable()
{
Enemy.ReachedBase -= OnReachedBase;
Enemy.Killed -= OnKilled;
spawner.WaveStarted -= ShowWave;
}
void Start()
{
money = startMoney;
lives = startLives;
ShowMoney();
ShowLives();
}
public bool TrySpend(int amount)
{
if (amount > money)
{
return false;
}
money -= amount;
ShowMoney();
return true;
}
public void Earn(int amount)
{
money += amount;
ShowMoney();
}
void OnKilled(Enemy enemy)
{
Earn(enemy.data.reward);
}
void OnReachedBase(Enemy enemy)
{
lives -= enemy.data.damage;
ShowLives();
}
void ShowMoney()
{
moneyText.text = "Money: " + money;
}
void ShowLives()
{
livesText.text = "Lives: " + lives;
}
void ShowWave(int wave, int total)
{
waveText.text = "Wave " + wave + "/" + total;
}
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.