Menu
CoddyTech

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.
challenge icon

Aufgabe

Mittel

Jeder Turm wählt den nächstgelegenen Gegner in Reichweite aus.

  1. Füge in Enemy public static readonly List<Enemy> All = new List<Enemy>(); hinzu; füge in OnEnable this hinzu und entferne es in OnDisable.
  2. Füge in Tower public float range = 4f; und private Enemy target; hinzu.
  3. Suche jeden Frame den nächstgelegenen Gegner in Enemy.All innerhalb von range (oder null), gib "Target: " + found.name aus, wenn er neu ist, und speichere ihn in target.

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