Menu
CoddyTech

Personalizzalo

Lezione 25 di 25 del corso Gioco Unity: Tower Defense di Coddy.

Il gioco ha bisogno di una schermata finale. Si perde quando le vite arrivano a 0 e si vince quando sono state inviate tutte le ondate e non è rimasto nessun nemico. Lo spawner aspetta che il campo sia vuoto con WaitUntil, che controlla una lambda a ogni frame, poi genera un evento:

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

Entrambe le schermate finali mostrano l'EndPanel e arrestano il gioco con Time.timeScale = 0. Un Tank che infligge 2 danni quando resta 1 vita farebbe saltare il controllo del valore esattamente uguale a 0, quindi Mathf.Max mantiene le vite a 0 o più. Time.timeScale mantiene il suo valore quando si carica una scena, quindi «Gioca di nuovo» lo reimposta prima a 1.

Poi personalizza il gioco. Qui startMoney (150), startLives (20) e timeBetweenWaves (8) assumono i valori nel codice, perché l'Inspector di questo giocatore è di sola lettura: modificali dove sono dichiarati e premi «Gioca». Una difesa mista nelle curve del percorso, potenziata man mano che arrivano i soldi, batte il gioco predefinito.

challenge icon

Sfida

Difficile

Termina la partita, poi perfezionala nel tuo codice.

  1. WaveSpawner: aggiungi public event Action AllWavesCleared;, attivato dopo l’ultima ondata quando Enemy.All.Count == 0 (WaitUntil).
  2. GameManager: mantieni le vite pari o superiori a 0. End(message) mostra endPanel e endText serializzati e imposta Time.timeScale = 0: Game Over con 0 vite, You Win! quando tutte le ondate sono state superate.
  3. public void PlayAgain(): imposta Time.timeScale = 1, poi ricarica la scena.

Premi «Gioca» e difendi la base per tutte e otto le ondate. Poi premi «Verifica».

Provalo tu

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 iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Gioco Unity: Tower Defense

Esercitati da solo: Playground Unity