Tower-Defense – leicht
Teil des Abschnitts Spielarchitektur in Unity der Unity-Journey von Coddy. Lektion 61 von 64.
Kriecher marschieren die Straße entlang auf deine Basis zu, und ein einzelner Turm bewacht sie. Der Turm schießt Bolzen auf den ihm nächsten Kriecher, solange sich einer in Reichweite befindet, und jeder Kriecher, den er erledigt, bringt Gold ein. Mit der Leertaste gibst du das Gold für die nächste Stufe des Turms aus: Mit jeder Stufe reicht er weiter, schießt schneller oder trifft härter. Ein Kriecher, der die Basis erreicht, kommt durch. Die Stufen sind Spieldaten, die ein Designer in einem Asset anpasst, ohne den Code anzufassen. Da der Turm viele Bolzen abfeuert, verwendet er sie aus einem Pool wieder, statt für jeden Schuss einen zu erstellen und zu zerstören.
Schreibe zwei Skripte: TowerData, den Asset-Typ, und Tower. Creep, Bolt und CreepSpawner sind bereits fertig, ebenso die Nearest- und Show-Methoden des Turms.
Aufgabe
SchwerVervollständige den Turm; Nearest(range) und Show() sind bereit.
TowerLevel: serialisierbar, öffentlichesrange,fireEvery,damage,cost.TowerDataenthältpublic List<TowerLevel> levels.- Platziere alle
fireEverySekunden, wennNearest(range)einen Kriecher findet, einen Bolzen aus einemObjectPool<Bolt>beim Turm:bolt.Launch(creep, damage, pool.Release). Show()wird aufgerufen, nachdemCreep.Killedbountyauszahlt und nachdem die Leertaste das nächste Level für dessencostkauft; protokolliereTower level 2.
Drücke „Spielen“ und verbessere den Turm. Drücke dann „Prüfen“.
Probier es selbst
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.Pool;
using TMPro;
public class Tower : MonoBehaviour
{
[SerializeField] private TowerData data;
[SerializeField] private Bolt boltPrefab;
[SerializeField] private TMP_Text infoText;
private int level;
private int gold;
// Fertig: der Creep in Reichweite, der dem Turm am nächsten ist, oder null.
Creep Nearest(float range)
{
Creep nearest = null;
float best = Mathf.Infinity;
foreach (Collider hit in Physics.OverlapSphere(transform.position, range))
{
if (hit.TryGetComponent(out Creep creep))
{
float distance = Vector3.Distance(transform.position, creep.transform.position);
if (distance < best)
{
best = distance;
nearest = creep;
}
}
}
return nearest;
}
// Fertig: zeigt das Level und das Gold an, zum Beispiel als Level 1, 0 gold.
void Show()
{
infoText.text = "Level " + (level + 1) + ", " + gold + " gold";
}
}
Alle Lektionen in Spielarchitektur in Unity
1Komponenten statt Hierarchien
Kleine KomponentenEin Basis-GegnerskriptAbstrakte KomponentenZusammenwirkende KomponentenRückblick: Modulares GeschützRückblick: Zwillingskanone4Serialisierte Daten
Serialisierbare KlassenListen im InspectorEnums im InspectorRückblick: Loot-TabelleRückblick: Beute auswürfeln2Schnittstellen in Unity
IDamageableSchnittstellen und TryGetComponentGetComponentsZusammenfassung: InteraktionstasteZusammenfassung: Nächstes in Reichweite5ScriptableObjects
Daten-AssetsWaffenwerteGemeinsame EinstellungenDen Wind speichernWellen als DatenRückblick: Item-DatenbankRückblick: Im Shop einkaufen8Wiederverwendbarer Code
ErweiterungsmethodenEin generisches SingletonGenerische HilfsmethodenRückblick: FindNearestÜbe selbstständig: Unity-Playground