Menu
CoddyTech

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

Aufgabe

Mittel
  1. Füge in Enemy die neue Liste public static readonly List<Enemy> All hinzu. Jeder Gegner fügt sich in OnEnable selbst hinzu und entfernt sich in OnDisable selbst.
  2. Füge in Tower einen öffentlichen float range (das ArrowTower-Prefab legt den Wert auf 4.5 fest) und ein privates Enemy target hinzu.
  3. Setze in jedem Frame target auf den Gegner in Enemy.All, der dem Turm am nächsten ist, sofern er sich innerhalb von range befindet. Ist kein Gegner in Reichweite, ist target null.

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;
}
quiz iconTeste dich selbst

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