Znajdź cel
Lekcja 7 z 18 w kursie Gra Unity: Obrona wieżowa 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
Średni- W
Enemydodaj nową listępublic static readonly List<Enemy> All. Każdy przeciwnik dodaje się do niej wOnEnablei usuwa z niej wOnDisable. - W
Towerdodaj publiczne pole typu floatrange(prefab ArrowTower ustawia wartość 4.5) oraz prywatne pole typu Enemytarget. - W każdej klatce ustawiaj
targetna przeciwnika zEnemy.All, który znajduje się najbliżej wieży, o ile jest w zasięgurange. Jeśli w zasięgu nie ma żadnego przeciwnika,targetma wartość null.
Wieża na razie nic nie robi ze swoim celem: w następnej lekcji obrócisz ją w jego stronę. Naciśnij Play, zbuduj wieżę obok ścieżki, a następnie naciśnij Check.
Spróbuj swoich sił
using UnityEngine;
public class Tower : MonoBehaviour
{
public int cost = 50;
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.