Gestalte es selbst
Lektion 25 von 25 im Kurs Unity-Spiel: Tower Defense von Coddy.
Dem Spiel fehlt noch sein Ende. Es ist verloren, wenn die Leben 0 erreichen, und gewonnen, wenn jede Welle losgeschickt wurde und kein Gegner mehr übrig ist. Der Spawner wartet mit WaitUntil auf ein leeres Spielfeld. Dabei wird ein Lambda-Ausdruck einmal pro Frame geprüft. Anschließend löst er ein Ereignis aus:
yield return new WaitUntil(() => switchesOn == switches.Length);Bei beiden möglichen Spielenden wird das EndPanel angezeigt und das Spiel mit Time.timeScale = 0 angehalten. Ein Tank, der 2 Schaden verursacht, wenn noch 1 Leben übrig ist, würde eine Prüfung auf genau 0 überspringen. Deshalb sorgt Mathf.Max dafür, dass die Anzahl der Leben bei 0 oder höher bleibt. Time.timeScale behält seinen Wert beim Laden einer Szene bei, daher setzt „Erneut spielen“ den Wert zuerst wieder auf 1.
Gestalte das Spiel jetzt nach deinen Vorstellungen. Hier übernehmen startMoney (150), startLives (20) und timeBetweenWaves (8) die Werte aus deinem Code, da der Inspector dieses Spielers schreibgeschützt ist: Ändere sie dort, wo sie deklariert sind, und drücke auf „Spielen“. Eine gemischte Verteidigung in den Kurven des Pfads, die mit dem eingehenden Geld aufgerüstet wird, schlägt das Standardspiel.
Aufgabe
SchwerBeende das Spiel und passe es anschließend in deinem Code an.
WaveSpawner: Fügepublic event Action AllWavesCleared;hinzu, das nach der letzten Welle ausgelöst wird, sobaldEnemy.All.Count == 0(WaitUntil).GameManager: Stelle sicher, dass die Anzahl der Leben bei 0 oder mehr bleibt.End(message)zeigtendPanelundendTextaus dem Inspector an und setztTime.timeScale = 0:Game Overbei 0 Leben,You Win!, wenn alle Wellen abgeschlossen sind.public void PlayAgain():Time.timeScale = 1, dann die Szene neu laden.
Drücke auf „Spielen“ und verteidige die Basis gegen alle acht Wellen. Klicke anschließend 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 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;
}
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Unity-Spiel: Tower Defense
Übe selbstständig: Unity-Playground