Menu
CoddyTech

Tùy chỉnh theo ý bạn

Bài học 25 trên 25 trong khóa học Game Unity: thủ thành của Coddy.

Trò chơi cần có kết thúc. Người chơi thua khi số mạng còn 0 và thắng khi tất cả các đợt quân đã xuất hiện, không còn kẻ địch nào. Bộ tạo quân chờ bàn chơi trống bằng WaitUntil, hàm này kiểm tra một hàm lambda sau mỗi khung hình, rồi phát ra một sự kiện:

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

Cả hai kết thúc đều hiển thị EndPanel và dừng trò chơi bằng Time.timeScale = 0. Một Tank chịu sát thương 2 khi chỉ còn 1 mạng sẽ bỏ qua bước kiểm tra giá trị đúng bằng 0, vì vậy Mathf.Max giữ số mạng ở mức 0 trở lên. Time.timeScale giữ nguyên giá trị khi tải cảnh, nên nút Chơi lại đặt giá trị này về 1 trước.

Sau đó, hãy biến trò chơi thành của riêng bạn. Ở đây, startMoney (150), startLives (20) và timeBetweenWaves (8) lấy giá trị trong code của bạn, vì Inspector của người chơi này chỉ đọc được: hãy thay đổi chúng ở nơi khai báo rồi nhấn Chơi. Một hệ thống phòng thủ kết hợp ở các khúc cua trên đường đi, được nâng cấp khi có thêm tiền, sẽ hiệu quả hơn trò chơi mặc định.

challenge icon

Thử thách

Khó

Kết thúc trò chơi, rồi điều chỉnh code.

  1. WaveSpawner: thêm public event Action AllWavesCleared;, kích hoạt sau đợt cuối cùng khi Enemy.All.Count == 0 (WaitUntil).
  2. GameManager: giữ số mạng ở mức 0 trở lên. End(message) hiển thị endPanel và endText đã tuần tự hóa, đồng thời đặt Time.timeScale = 0: Game Over khi còn 0 mạng, You Win! khi tất cả các đợt đã kết thúc.
  3. public void PlayAgain(): đặt Time.timeScale = 1, rồi tải lại cảnh.

Nhấn Chơi và bảo vệ căn cứ qua cả tám đợt. Sau đó nhấn Kiểm tra.

Tự làm thử

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 iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Game Unity: thủ thành

Tự luyện tập: Playground Unity