Dostosuj do siebie
Lekcja 25 z 25 w kursie Gra w Unity: Obrona wieży w Coddy.
Gra potrzebuje zakończenia. Gracz przegrywa, gdy liczba żyć spadnie do 0, a wygrywa, gdy zostaną wysłane wszystkie fale i nie pozostanie żaden przeciwnik. Spawner czeka na puste pole za pomocą WaitUntil, które sprawdza lambdę raz na klatkę, a następnie wywołuje zdarzenie:
yield return new WaitUntil(() => switchesOn == switches.Length);Każde z zakończeń wyświetla EndPanel i zatrzymuje grę za pomocą Time.timeScale = 0. Czołg, który zada 2 obrażenia, gdy zostało 1 życie, ominąłby sprawdzenie, czy wartość wynosi dokładnie 0, dlatego Mathf.Max utrzymuje liczbę żyć na poziomie 0 lub wyższym. Time.timeScale zachowuje swoją wartość po załadowaniu sceny, więc „Zagraj ponownie” najpierw przywraca jej wartość 1.
Teraz dostosuj grę do siebie. W tym przypadku startMoney (150), startLives (20) i timeBetweenWaves (8) przyjmują wartości zapisane w kodzie, ponieważ Inspektor tego gracza jest tylko do odczytu: zmień je w miejscu deklaracji i naciśnij „Graj”. Mieszana obrona na zakrętach ścieżki, ulepszana w miarę zdobywania pieniędzy, sprawdzi się lepiej niż domyślna strategia w grze.
Wyzwanie
TrudnyZakończ grę, a następnie dostosuj ją w swoim kodzie.
WaveSpawner: dodajpublic event Action AllWavesCleared;, wywoływane po ostatniej fali, gdyEnemy.All.Count == 0(WaitUntil).GameManager: utrzymuj liczbę żyć na poziomie 0 lub wyższym.End(message)wyświetla serializowaneendPaneliendTextoraz ustawiaTime.timeScale = 0:Game Overprzy 0 życiach,You Win!, gdy wszystkie fale zostaną wyczyszczone.public void PlayAgain():Time.timeScale = 1, a następnie ponownie wczytaj scenę.
Naciśnij „Graj” i broń bazy przez wszystkie osiem fal. Następnie naciśnij „Sprawdź”.
Spróbuj swoich sił
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;
}
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Gra w Unity: Obrona wieży
Poćwicz samodzielnie: Edytor online Unity