Menu
CoddyTech

Buat Sesuai Keinginanmu

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

Game ini membutuhkan bagian akhir. Kamu kalah saat nyawa mencapai 0, dan menang saat semua gelombang telah dikirim serta tidak ada musuh yang tersisa. Pemuncul menunggu hingga papan kosong dengan WaitUntil, yang memeriksa lambda sekali setiap frame, lalu memicu sebuah peristiwa:

yield return new WaitUntil(() => switchesOn == switches.Length);

Kedua akhir menampilkan EndPanel dan menghentikan game dengan Time.timeScale = 0. Tank yang menerima 2 kerusakan saat tersisa 1 nyawa akan melewati pemeriksaan untuk nilai tepat 0, jadi Mathf.Max menjaga jumlah nyawa tetap 0 atau lebih. Time.timeScale mempertahankan nilainya saat memuat scene, jadi Main Lagi mengaturnya kembali ke 1 terlebih dahulu.

Lalu buat game ini sesuai keinginanmu. Di sini, startMoney (150), startLives (20), dan timeBetweenWaves (8) mengambil nilai dari kodemu karena Inspector pemain ini hanya bisa dibaca: ubah nilainya di tempat variabel tersebut dideklarasikan, lalu tekan tombol “Main”. Pertahanan gabungan di tikungan jalur, yang ditingkatkan seiring bertambahnya uang, mengalahkan game bawaan.

challenge icon

Tantangan

Sulit

Akhiri permainan, lalu sesuaikan kodemu.

  1. WaveSpawner: tambahkan public event Action AllWavesCleared;, yang dipicu setelah gelombang terakhir ketika Enemy.All.Count == 0 (WaitUntil).
  2. GameManager: pastikan jumlah nyawa 0 atau lebih. End(message) menampilkan endPanel dan endText yang diserialisasi, lalu mengatur Time.timeScale = 0: Game Over saat jumlah nyawa 0, You Win! ketika semua gelombang selesai.
  3. public void PlayAgain(): Time.timeScale = 1, lalu muat ulang scene.

Tekan tombol “Main” dan pertahankan markas sepanjang delapan gelombang. Lalu tekan tombol “Periksa”.

Coba sendiri

using UnityEngine;
using TMPro;

public class GameManager : MonoBehaviour
{
    [SerializeField] private int startMoney = 150;
    [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

Latihan sendiri: Playground Unity