Menu
CoddyTech

Personnalisez-le

Leçon 25 sur 25 du cours Jeu Unity : défense de tours de Coddy.

Le jeu a besoin d'une fin. Il est perdu lorsque le nombre de vies atteint 0, et gagné lorsque toutes les vagues ont été envoyées et qu'il ne reste aucun ennemi. Le générateur de vagues attend que le plateau soit vide avec WaitUntil, qui vérifie une lambda une fois par image, puis déclenche un événement :

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

Dans les deux cas, le panneau de fin s'affiche et le jeu s'arrête avec Time.timeScale = 0. Un Tank qui inflige 2 dégâts alors qu'il reste 1 vie ferait passer le compteur sous 0, sans déclencher une vérification portant exactement sur 0 ; Mathf.Max maintient donc le nombre de vies à 0 ou plus. Time.timeScale conserve sa valeur lors du chargement d'une scène, alors « Jouer à nouveau » le réinitialise d'abord à 1.

Ensuite, personnalise le jeu. Ici, startMoney (150), startLives (20) et timeBetweenWaves (8) prennent les valeurs indiquées dans ton code, car l'Inspector de ce joueur est en lecture seule : modifie-les là où elles sont déclarées et appuie sur « Jouer ». Une défense variée dans les virages du chemin, améliorée au fur et à mesure que l'argent arrive, est plus efficace que celle du jeu par défaut.

challenge icon

Défi

Difficile

Termine la partie, puis ajuste-la dans ton code.

  1. WaveSpawner : ajoute public event Action AllWavesCleared;, déclenché après la dernière vague une fois que Enemy.All.Count == 0 (WaitUntil).
  2. GameManager : maintiens le nombre de vies à 0 ou plus. End(message) affiche endPanel et endText sérialisés, puis définit Time.timeScale = 0 : Game Over quand il reste 0 vie, You Win! lorsque toutes les vagues sont terminées.
  3. public void PlayAgain() : Time.timeScale = 1, puis recharge la scène.

Appuie sur « Jouer » et défends la base pendant les huit vagues. Puis clique sur « Vérifier ».

Essayez vous-même

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 iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Jeu Unity : défense de tours

Entraînez-vous par vous-même : Playground Unity