Menu
CoddyTech

Contador de oleadas

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

El HUD muestra el número de oleada. El spawner lo sabe y GameManager lo muestra, así que el spawner genera un evento de C#, WaveStarted, con la oleada y el número de oleadas. A diferencia de los eventos estáticos de los enemigos, este pertenece a un único spawner, y GameManager se suscribe mediante su campo spawner:

void OnEnable()
{
    spawner.WaveStarted += ShowWave;
}

Un Action<int, int> pasa dos int, así que ShowWave recibe dos: void ShowWave(int wave, int total).

challenge icon

Desafío

Intermedio

Muestra qué oleada está activa.

  1. En WaveSpawner, añade public event Action<int, int> WaveStarted; (using System;) y actívalo con i + 1 y waves.Count cuando empiece una oleada.
  2. En GameManager, añade spawner serializado (WaveSpawner) y waveText (TMP_Text). Suscríbete en OnEnable, cancela la suscripción en OnDisable y muestra Wave 1/8.

Pulsa «Jugar»: Wave 1/8 aparece en la parte superior derecha cuando empieza la primera oleada. 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 TMP_Text moneyText;
    [SerializeField] private TMP_Text livesText;

    private int money;
    private int lives;

    void OnEnable()
    {
        Enemy.ReachedBase += OnReachedBase;
        Enemy.Killed += OnKilled;
    }

    void OnDisable()
    {
        Enemy.ReachedBase -= OnReachedBase;
        Enemy.Killed -= OnKilled;
    }

    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;
    }
}

Todas las lecciones de Juego de Unity: Defensa de torres

Practica por tu cuenta: Playground de Unity