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.
Thử thách
KhóKết thúc trò chơi, rồi điều chỉnh code.
WaveSpawner: thêmpublic event Action AllWavesCleared;, kích hoạt sau đợt cuối cùng khiEnemy.All.Count == 0(WaitUntil).GameManager: giữ số mạng ở mức 0 trở lên.End(message)hiển thịendPanelvàendTextđã tuần tự hóa, đồng thời đặtTime.timeScale = 0:Game Overkhi còn 0 mạng,You Win!khi tất cả các đợt đã kết thúc.public void PlayAgain(): đặtTime.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;
}
}
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