Menu
CoddyTech

Hazlo tuyo

Lección 25 de 25 del curso Juego de Unity: Defensa de torres de Coddy.

El juego necesita un final. Se pierde cuando las vidas llegan a 0 y se gana cuando se han enviado todas las oleadas y no queda ningún enemigo. El generador de oleadas espera a que el tablero esté vacío con WaitUntil, que comprueba una lambda una vez por fotograma y después lanza un evento:

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

Cualquiera de los dos finales muestra el EndPanel y detiene el juego con Time.timeScale = 0. Un Tank que recibe 2 de daño cuando queda 1 vida se saltaría una comprobación de exactamente 0, así que Mathf.Max mantiene las vidas en 0 o más. Time.timeScale conserva su valor al cargar una escena, así que «Jugar de nuevo» primero lo restablece a 1.

Después, haz tuyo el juego. Aquí, startMoney (150), startLives (20) y timeBetweenWaves (8) toman los valores de tu código, ya que el Inspector de este jugador es de solo lectura: cámbialos donde se declaran y pulsa «Jugar». Una defensa variada en las curvas del camino, mejorada a medida que llega el dinero, supera al juego predeterminado.

challenge icon

Desafío

Difícil

Termina el juego y luego ajústalo en tu código.

  1. WaveSpawner: añade public event Action AllWavesCleared;, que se activa después de la última oleada cuando Enemy.All.Count == 0 (WaitUntil).
  2. GameManager: mantén las vidas en 0 o más. End(message) muestra endPanel y endText serializados y establece Time.timeScale = 0: Game Over cuando quedan 0 vidas, You Win! cuando se hayan despejado todas las oleadas.
  3. public void PlayAgain(): establece Time.timeScale = 1 y luego vuelve a cargar la escena.

Pulsa «Jugar» y defiende la base durante las ocho oleadas. Luego pulsa «Comprobar».

Pruébalo tú mismo

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 iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Juego de Unity: Defensa de torres

Practica por tu cuenta: Playground de Unity