Найти цель
Урок 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.Задание
Средне- В
Enemyдобавь новый списокpublic static readonly List<Enemy> All. Каждый враг добавляет себя вOnEnableи удаляет себя вOnDisable. - В
Towerдобавь публичное поле floatrange(в префабе ArrowTower задано значение 4.5) и приватное поле Enemytarget. - Каждый кадр присваивай
targetврага изEnemy.All, ближайшего к башне, если он находится в пределахrange. Если врагов в пределах досягаемости нет,targetравен null.
Пока башня ничего не делает со своей целью: в следующем уроке она будет поворачиваться к ней. Нажми Play, построй башню рядом с путем, затем нажми Check.
Попробуйте сами
using UnityEngine;
public class Tower : MonoBehaviour
{
public int cost = 50;
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.