Ziel finden
Lektion 8 von 25 im Kurs Unity-Spiel: Tower Defense von Coddy.
Ein Turm schießt auf den Gegner, der ihm am nächsten ist, solange sich dieser Gegner innerhalb der range des Turms befindet. Um einen Gegner auszuwählen, benötigt der Turm alle Gegner auf dem Spielfeld. FindObjectsByType<Enemy> würde für jeden Turm in jedem Frame die gesamte Szene durchsuchen. Deshalb führen die Gegner stattdessen eine Liste mit sich selbst: eine statische Liste in der Klasse Enemy, der jeder Gegner in OnEnable beitritt und die er in OnDisable wieder verlässt. Unity ruft OnDisable für ein Objekt auf, das zerstört wird, daher verlässt auch ein besiegter Gegner die Liste. Pickups in einem Spiel können dasselbe tun:
public class Pickup : MonoBehaviour
{
public static readonly List<Pickup> All = new List<Pickup>();
void OnEnable()
{
All.Add(this);
}
void OnDisable()
{
All.Remove(this);
}
}Den nächsten zu finden, funktioniert mit einer Schleife, die sich den bisher besten merkt. Ein Magnet, der das nächste Pickup innerhalb von pullRange anzieht, beginnt ohne Pickup und mit der Reichweite als bester Entfernung, sodass ein weiter entferntes Pickup niemals gewinnen kann:
Pickup best = null;
float bestDistance = pullRange;
foreach (Pickup pickup in Pickup.All)
{
// Näher als der bisher beste? Behalte ihn und seine Entfernung.
}Vector3.Distance(a, b) liefert die Entfernung zwischen zwei Punkten. Wenn sich nichts innerhalb der Reichweite befindet, behält die Schleife nichts bei, und das Ergebnis ist null.Aufgabe
MittelJeder Turm wählt den nächstgelegenen Gegner in Reichweite aus.
- Füge in
Enemypublic static readonly List<Enemy> All = new List<Enemy>();hinzu; füge inOnEnablethishinzu und entferne es inOnDisable. - Füge in
Towerpublic float range = 4f;undprivate Enemy target;hinzu. - Suche jeden Frame den nächstgelegenen Gegner in
Enemy.Allinnerhalb vonrange(oder null), gib"Target: " + found.nameaus, wenn er neu ist, und speichere ihn intarget.
Drücke „Spielen“ und baue neben dem Pfad: Die Console zeigt den Namen jedes neuen Ziels an. Drücke dann „Prüfen“.
Probier es selbst
using UnityEngine;
// Kommt später: Ein Turm findet einen Feind in Reichweite, dreht sich zu ihm und feuert.
public class Tower : MonoBehaviour
{
}
Alle Lektionen in Unity-Spiel: Tower Defense
Übe selbstständig: Unity-Playground