Menu
CoddyTech

Найти цель

Урок 8 из 25 курса Игра на Unity: Tower Defense на Coddy.

Башня стреляет по ближайшему к ней врагу, если этот враг находится в пределах range башни. Чтобы выбрать цель, башне нужны сведения обо всех врагах на игровом поле. FindObjectsByType<Enemy> искал бы объекты во всей сцене каждый кадр для каждой башни, поэтому вместо этого враги ведут собственный список: статический список в классе Enemy, в который каждый враг добавляется в OnEnable и из которого удаляется в OnDisable. Unity вызывает OnDisable у уничтожаемого объекта, поэтому погибший враг тоже удаляется из списка. Подборные предметы в игре могут работать так же:

public class Pickup : MonoBehaviour
{
    public static readonly List<Pickup> All = new List<Pickup>();

    void OnEnable()
    {
        All.Add(this);
    }

    void OnDisable()
    {
        All.Remove(this);
    }
}

Поиск ближайшего предмета — это цикл, который запоминает лучший вариант на текущий момент. Магнит, который притягивает ближайший предмет в пределах pullRange, начинает без выбранного предмета, а в качестве наилучшего расстояния задаёт дальность притяжения, поэтому более удалённый предмет не сможет стать лучшим:

Pickup best = null;
float bestDistance = pullRange;
foreach (Pickup pickup in Pickup.All)
{
    // Ближе, чем лучший вариант на данный момент? Сохрани его и расстояние до него
}
Vector3.Distance(a, b) возвращает расстояние между двумя точками. Если в пределах дальности ничего нет, цикл ничего не сохраняет, и результатом будет null.
challenge icon

Задание

Средне

Каждая башня выбирает ближайшего врага в радиусе действия.

  1. В Enemy добавь public static readonly List<Enemy> All = new List<Enemy>();; добавляй this в OnEnable, удаляй его в OnDisable.
  2. В Tower добавь public float range = 4f; и private Enemy target;.
  3. Каждый кадр находи ближайшего врага в Enemy.All в пределах range (или null), выводи в журнал "Target: " + found.name, если он новый, и сохраняй его в target.

Нажми «Играть» и построй башню у пути: в Console отображается имя каждой новой цели. Затем нажми «Проверить».

Попробуйте сами

using UnityEngine;

// Позже: башня находит врага в зоне досягаемости, поворачивается к нему и стреляет.
public class Tower : MonoBehaviour
{
}

Все уроки раздела Игра на Unity: Tower Defense

Потренируйтесь самостоятельно: Песочница Unity