Personnalisez-le
Leçon 18 sur 18 du cours Jeu Unity : défense de tours de Coddy.
Le jeu a besoin d’une fin. La partie est perdue lorsque les vies atteignent 0, et gagnée lorsque toutes les vagues ont été envoyées et qu’il ne reste aucun ennemi sur le plateau. Le spawner sait quand la dernière vague est sortie, et Enemy.All sait combien d’ennemis il reste : le spawner attend donc que le plateau soit vide, puis déclenche un événement auquel GameManager réagit. Une coroutine attend une condition avec WaitUntil, qui vérifie une lambda une fois par image. Une salle de puzzle qui ouvre sa sortie dès que tous les interrupteurs sont activés :
yield return new WaitUntil(() => switchesOn == switches.Length);
exit.SetActive(true);Dans les deux cas, la fin affiche le EndPanel avec un message et arrête le jeu avec Time.timeScale = 0. Le nombre de vies ne descend jamais en dessous de 0 : un Tank qui subit 2 dégâts alors qu’il lui reste 1 vie passerait directement sous 0, sans déclencher une vérification de l’égalité exacte à 0. Mathf.Max maintient donc le nombre de vies à 0 ou plus.
Le bouton Play Again recharge la scène. Time.timeScale ne fait pas partie de la scène et conserve sa valeur lors du chargement : un jeu arrêté à 0 resterait donc figé au redémarrage. Remets sa valeur à 1 avant le chargement.
Ensuite, personnalise le jeu. Tous les paramètres d’équilibrage se trouvent dans l’Inspector :
- Le GameManager du jeu :
startMoney(150) etstartLives(20). - Les
wavesdu Spawner : huit rangées indiquant l’ennemi, le nombre et l’espacement, ainsi quetimeBetweenWaves(8). - Les assets EnemyData : vitesse, santé, récompense et nombre de vies perdues pour chaque type. Le Boss a 450 points de vie et en fait perdre 10.
- Les assets TowerData : coût, dégâts, portée, cadence de tir, valeurs des améliorations, dégâts de zone du Cannon et ralentissement de la tour Frost.
Les valeurs par défaut peuvent être vaincues avec une défense variée dans les virages du chemin, améliorée au fur et à mesure que l’argent rentre ; quelques tours d’un seul type ne suffiront pas. Modifie une valeur à la fois et joue pour voir son effet.
Défi
Difficile- Dans
WaveSpawner, ajoutepublic event Action AllWavesCleared. Après l’envoi de la dernière vague, attends queEnemy.Allsoit vide, puis déclenche cet événement. - Dans
GameManager, ajoute les champs sérialisésendPanel(un GameObject) etendText(un TMP_Text). Le nombre de vies ne descend jamais en dessous de 0, et lorsqu’il atteint 0, la partie se termine avecGame Over. Lorsque toutes les vagues sont terminées et qu’il reste des vies, la partie se termine avecYou Win!. La fin affiche le panneau avec le message et définitTime.timeScalesur 0. - Écris
public void PlayAgain(), appelée par le bouton du panneau : rétablis la vitesse normale du temps et recharge la scène active.
Clique sur Play et défends la base contre les huit vagues, puis clique sur Check. Ensuite, ajuste le jeu dans l’Inspector et joue comme tu le souhaites.
Essayez vous-même
using UnityEngine;
using TMPro;
public class GameManager : MonoBehaviour
{
[SerializeField] private int startMoney = 100;
[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;
}
}
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.