Menu
CoddyTech

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.

challenge icon

Wyzwanie

Trudny

Zakończ grę, a następnie dostosuj ją w swoim kodzie.

  1. WaveSpawner: dodaj public event Action AllWavesCleared;, wywoływane po ostatniej fali, gdy Enemy.All.Count == 0 (WaitUntil).
  2. GameManager: utrzymuj liczbę żyć na poziomie 0 lub wyższym. End(message) wyświetla serializowane endPanel i endText oraz ustawia Time.timeScale = 0: Game Over przy 0 życiach, You Win!, gdy wszystkie fale zostaną wyczyszczone.
  3. 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;
    }
}
quiz iconSprawdź się

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