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.
Sfida
DifficileTermina la partita, poi perfezionala nel tuo codice.
WaveSpawner: aggiungipublic event Action AllWavesCleared;, attivato dopo l’ultima ondata quandoEnemy.All.Count == 0(WaitUntil).GameManager: mantieni le vite pari o superiori a 0.End(message)mostraendPaneleendTextserializzati e impostaTime.timeScale = 0:Game Overcon 0 vite,You Win!quando tutte le ondate sono state superate.public void PlayAgain(): impostaTime.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;
}
}
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