Menu
CoddyTech

Найти цель

Урок 7 из 18 курса Игра в Unity: защита башен на 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. Каждый враг добавляет себя в OnEnable и удаляет себя в OnDisable.
  2. В Tower добавь публичное поле float range (в префабе ArrowTower задано значение 4.5) и приватное поле Enemy target.
  3. Каждый кадр присваивай target врага из Enemy.All, ближайшего к башне, если он находится в пределах range. Если врагов в пределах досягаемости нет, target равен null.

Пока башня ничего не делает со своей целью: в следующем уроке она будет поворачиваться к ней. Нажми Play, построй башню рядом с путем, затем нажми Check.

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

using UnityEngine;

public class Tower : MonoBehaviour
{
    public int cost = 50;
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Игра в Unity: защита башен