Menu
CoddyTech

Wellenzähler

Lektion 24 von 25 im Kurs Unity-Spiel: Tower Defense von Coddy.

Das HUD zeigt die Wellennummer an. Der Spawner kennt sie, und der GameManager zeigt sie an, daher löst der Spawner ein C#-Ereignis, WaveStarted, mit der Welle und der Anzahl der Wellen aus. Anders als die statischen Ereignisse der Gegner gehört es zu diesem einen Spawner, und der GameManager abonniert es über sein Feld spawner:

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

Ein Action<int, int> übergibt zwei ints, daher nimmt ShowWave zwei entgegen: void ShowWave(int wave, int total).

challenge icon

Aufgabe

Mittel

Zeige an, welche Welle gerade läuft.

  1. Füge in WaveSpawner public event Action<int, int> WaveStarted; (using System;) hinzu und löse das Ereignis zu Beginn einer Welle mit i + 1 und waves.Count aus.
  2. Füge in GameManager die serialisierten Felder spawner (WaveSpawner) und waveText (TMP_Text) hinzu. Abonniere das Ereignis in OnEnable, hebe das Abonnement in OnDisable auf und zeige Wave 1/8 an.

Drücke auf „Spielen“: Wenn die erste Welle beginnt, wird oben rechts Wave 1/8 angezeigt. Drücke dann auf „Prüfen“.

Probier es selbst

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

Alle Lektionen in Unity-Spiel: Tower Defense

Übe selbstständig: Unity-Playground