Menu
CoddyTech

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) dan startLives (20).
  • waves milik Spawner, delapan baris yang berisi musuh, jumlah, dan jarak, serta timeBetweenWaves (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.

challenge icon

Tantangan

Sulit
  1. Di WaveSpawner, tambahkan public event Action AllWavesCleared. Setelah wave terakhir dikirim, tunggu hingga Enemy.All kosong, lalu aktifkan event tersebut.
  2. Di GameManager, tambahkan field berseri endPanel (sebuah GameObject) dan endText (sebuah TMP_Text). Nyawa tidak pernah kurang dari 0, dan saat mencapai 0, permainan berakhir dengan Game Over. Saat semua wave berhasil dilewati dan masih ada nyawa, permainan berakhir dengan You Win!. Saat permainan berakhir, tampilkan panel dengan pesannya dan atur Time.timeScale ke 0.
  3. 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;
    }
}
quiz iconUji dirimu

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

Semua pelajaran di Game Unity: Tower Defense