Menu
CoddyTech

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

Wyzwanie

Średni
  1. W Enemy dodaj nową listę public static readonly List<Enemy> All. Każdy przeciwnik dodaje się do niej w OnEnable i usuwa z niej w OnDisable.
  2. W Tower dodaj publiczne pole typu float range (prefab ArrowTower ustawia wartość 4.5) oraz prywatne pole typu Enemy target.
  3. W każdej klatce ustawiaj target na przeciwnika z Enemy.All, który znajduje się najbliżej wieży, o ile jest w zasięgu range. Jeśli w zasięgu nie ma żadnego przeciwnika, target ma 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;
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Gra Unity: Obrona wieżowa