Ein Ziel finden
Lektion 7 von 18 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
Mittel- Füge in
Enemydie neue Listepublic static readonly List<Enemy> Allhinzu. Jeder Gegner fügt sich inOnEnableselbst hinzu und entfernt sich inOnDisableselbst. - Füge in
Towereinen öffentlichen floatrange(das ArrowTower-Prefab legt den Wert auf 4.5 fest) und ein privates Enemytargethinzu. - Setze in jedem Frame
targetauf den Gegner inEnemy.All, der dem Turm am nächsten ist, sofern er sich innerhalb vonrangebefindet. Ist kein Gegner in Reichweite, isttargetnull.
Der Turm macht mit seinem Ziel noch nichts: In der nächsten Lektion wird er sich zu ihm drehen. Drücke Play, baue einen Turm neben dem Weg und klicke dann auf Check.
Probier es selbst
using UnityEngine;
public class Tower : MonoBehaviour
{
public int cost = 50;
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.