Menu
CoddyTech

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

Wyzwanie

Średni

Każda wieża wybiera najbliższego wroga znajdującego się w zasięgu.

  1. W Enemy dodaj public static readonly List<Enemy> All = new List<Enemy>();; dodaj this w OnEnable, usuń je w OnDisable.
  2. W Tower dodaj public float range = 4f; oraz private Enemy target;.
  3. W każdej klatce znajdź najbliższego wroga w Enemy.All, który znajduje się w zasięgu range (albo null), wyświetl w konsoli "Target: " + found.name, gdy jest nowy, i zachowaj go w target.

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