Menu
CoddyTech

Personalize

Lição 25 de 25 do curso Jogo de Unity: Defesa de Torres da Coddy.

O jogo precisa de um final. Você perde quando as vidas chegam a 0 e vence quando todas as ondas tiverem sido enviadas e não restar nenhum inimigo. O spawner espera o tabuleiro ficar vazio com WaitUntil, que verifica uma lambda a cada quadro, e então dispara um evento:

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

Qualquer um dos finais exibe o EndPanel e para o jogo com Time.timeScale = 0. Um Tank que recebe 2 de dano quando resta 1 vida ultrapassaria uma verificação por exatamente 0, então Mathf.Max mantém as vidas em 0 ou mais. Time.timeScale mantém seu valor ao carregar uma cena, então “Jogar novamente” primeiro o redefine para 1.

Agora personalize o jogo. Aqui, startMoney (150), startLives (20) e timeBetweenWaves (8) usam os valores do seu código, já que o Inspector deste jogador é somente leitura: altere-os onde são declarados e pressione “Jogar”. Uma defesa variada nas curvas do caminho, aprimorada conforme o dinheiro chega, supera o jogo padrão.

challenge icon

Desafio

Difícil

Encerre o jogo e, em seguida, ajuste-o no seu código.

  1. WaveSpawner: adicione public event Action AllWavesCleared;, acionado após a última onda, quando Enemy.All.Count == 0 (WaitUntil).
  2. GameManager: mantenha as vidas em 0 ou mais. End(message) exibe endPanel e endText serializados e define Time.timeScale = 0: Game Over quando houver 0 vidas e You Win! quando todas as ondas forem concluídas.
  3. public void PlayAgain(): Time.timeScale = 1 e, em seguida, recarregue a cena.

Pressione “Jogar” e defenda a base durante todas as oito ondas. Em seguida, clique em “Verificar”.

Experimente você mesmo

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 iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Jogo de Unity: Defesa de Torres

Pratique por conta própria: Playground de Unity