Unity3D RTS: Выделение юнитов — гид по SelectGUI

Создаём стратегию в реальном времени на Unity3D. Этот раздел подробно описывает механизм выделения юнитов.

SelectGUI и область выделения

Объявляем Rect SelectGUI для отрисовки текстуры выделения и Rect SelectRect для области выделения юнитов. Классы Select и Clear остаются без изменений.

Обработка координат выделения

Определяем ширину и высоту Rect. Для корректной работы с отрицательными значениями (что может возникнуть, если пользователь начинает выделение снизу вверх), используем модуль ширины и высоты:

if (Weight < 0) Weight = -Weight;
if (Height < 0) Height = -Height;

Аналогично обрабатываем точки выделения (Point1, Point2): если вторая точка меньше первой, меняем их местами:

if (Point2.x < Point1.x) {
    float temp = Point1.x;
    Point1.x = Point2.x;
    Point2.x = temp;
}
if (Point2.y < Point1.y) {
    float temp = Point1.y;
    Point1.y = Point2.y;
    Point2.y = temp;
}

Выделение юнитов

Создаём Rect и перебираем юниты из списка Units в UnitManager. Цикл продолжается до тех пор, пока индекс i не превысит количество юнитов (UnitManager.Units.Count).

В цикле проверяем, находится ли позиция юнита на экране внутри Rect, используя метод Contains. Мировые координаты юнита преобразуются в экранные с помощью Camera.main.WorldToScreenPoint:

Vector2 screenPosition = Camera.main.WorldToScreenPoint(unit.transform.position);
if (selectRect.Contains(screenPosition)) {
    // Юнит находится в области выделения
}

Если позиция юнита находится внутри Rect, он добавляется в массив выделенных юнитов. Этот массив очищается перед каждым новым выделением. UnitControl не наследуется от MonoBehaviour, поэтому не может быть добавлен на сцену как GameObject.

UnitManager и UnitControl

UnitManager содержит список юнитов (Units), ссылки на которые добавляются в редакторе Unity. UnitControl отвечает за визуальное отображение выделения.

В этом уроке реализован механизм выделения юнитов. В следующем уроке рассмотрим класс InputUnit, позволяющий взаимодействовать с выделенными юнитами и изменять их цвет.

Что будем искать? Например,программа