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.
Desafío
DifícilTermina el juego y luego ajústalo en tu código.
WaveSpawner: añadepublic event Action AllWavesCleared;, que se activa después de la última oleada cuandoEnemy.All.Count == 0(WaitUntil).GameManager: mantén las vidas en 0 o más.End(message)muestraendPanelyendTextserializados y estableceTime.timeScale = 0:Game Overcuando quedan 0 vidas,You Win!cuando se hayan despejado todas las oleadas.public void PlayAgain(): estableceTime.timeScale = 1y 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;
}
}
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