Znajdź cel
Lekcja 8 z 25 w kursie Gra w Unity: Obrona wieży w Coddy.
Wieża strzela do najbliższego niej wroga, o ile ten wróg znajduje się w range wieży. Aby dokonać wyboru, wieża potrzebuje informacji o każdym wrogu na planszy. FindObjectsByType<Enemy> przeszukiwałoby całą scenę w każdej klatce dla każdej wieży, dlatego wrogowie prowadzą własną listę: statyczną listę w klasie Enemy, do której każdy wróg dołącza w OnEnable i z której odchodzi w OnDisable. Unity wywołuje OnDisable dla obiektu, który jest niszczony, więc martwy wróg również opuszcza listę. Znajdźki w grze mogą działać tak samo:
public class Pickup : MonoBehaviour
{
public static readonly List<Pickup> All = new List<Pickup>();
void OnEnable()
{
All.Add(this);
}
void OnDisable()
{
All.Remove(this);
}
}Znajdowanie najbliższego obiektu to pętla, która zapamiętuje dotychczas najlepszy wynik. Magnes przyciągający najbliższą znajdźkę w zasięgu pullRange zaczyna bez żadnej znajdźki i z zasięgiem ustawionym jako najlepsza odległość, więc dalsza znajdźka nigdy nie może wygrać:
Pickup best = null;
float bestDistance = pullRange;
foreach (Pickup pickup in Pickup.All)
{
// Bliżej niż najlepszy znaleziony dotąd? Zachowaj go i odległość do niego
}Vector3.Distance(a, b) zwraca odległość między dwoma punktami. Jeśli nic nie znajduje się w zasięgu, pętla niczego nie zachowuje, a wynikiem jest null.Wyzwanie
ŚredniKażda wieża wybiera najbliższego wroga znajdującego się w zasięgu.
- W
Enemydodajpublic static readonly List<Enemy> All = new List<Enemy>();; dodajthiswOnEnable, usuń je wOnDisable. - W
Towerdodajpublic float range = 4f;orazprivate Enemy target;. - W każdej klatce znajdź najbliższego wroga w
Enemy.All, który znajduje się w zasięgurange(albo null), wyświetl w konsoli"Target: " + found.name, gdy jest nowy, i zachowaj go wtarget.
Naciśnij Play i buduj przy ścieżce: w konsoli pojawi się nazwa każdego nowego celu. Następnie naciśnij Check.
Spróbuj swoich sił
using UnityEngine;
// Później: wieża znajduje przeciwnika w zasięgu, obraca się w jego stronę i strzela.
public class Tower : MonoBehaviour
{
}
Wszystkie lekcje w sekcji Gra w Unity: Obrona wieży
Poćwicz samodzielnie: Edytor online Unity