Найти цель
Урок 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.Задание
СреднеКаждая башня выбирает ближайшего врага в радиусе действия.
- В
Enemyдобавьpublic static readonly List<Enemy> All = new List<Enemy>();; добавляйthisвOnEnable, удаляй его вOnDisable. - В
Towerдобавьpublic float range = 4f;иprivate Enemy target;. - Каждый кадр находи ближайшего врага в
Enemy.Allв пределахrange(или null), выводи в журнал"Target: " + found.name, если он новый, и сохраняй его вtarget.
Нажми «Играть» и построй башню у пути: в Console отображается имя каждой новой цели. Затем нажми «Проверить».
Попробуйте сами
using UnityEngine;
// Позже: башня находит врага в зоне досягаемости, поворачивается к нему и стреляет.
public class Tower : MonoBehaviour
{
}
Все уроки раздела Игра на Unity: Tower Defense
Потренируйтесь самостоятельно: Песочница Unity