Обновление групповых препятствий и цели при уничтожении системы

Название системы довольно многословно, но реальная реализация — всего 20 строк кода ObjC. Однако я не хочу обременять вас ObjC, я скорее напишу свой псевдоязык и объясню, что на самом деле делает система:

Представьте, что мы находимся в гуще боя — городские объекты горят, отряды выстраиваются группами и движутся к своим целям, уничтожая препятствия на своем пути. Препятствие — это в основном городской объект, который стоит на пути между атакующим и целью, которую необходимо уничтожить.

Когда мы развертываем юнит или, скорее, группу юнитов, мы сначала выясняем, что он должен атаковать (спойлер для FindGroupTargetOnDeploymentSystem). Затем мы движемся к нему или начинаем атаковать его, если он уже находится в пределах досягаемости. Иногда мы также не могли найти прямой путь к цели, поэтому у нас есть пара препятствий, которые нам нужно уничтожить, чтобы достичь нашей конечной цели.

Что же происходит, когда цель, которую мы так отчаянно хотим уничтожить, наконец уничтожена? Нам нужно найти новую цель! Вот и вся эта система.

UpdateGroupObstaclesAndTargetOnDestructionSystem — это реактивная система, которая срабатывает, когда компонент разрушения добавляется к сущности, у которой уже есть компонент городского объекта. Таким образом, в основном, когда городской объект разрушается, эта система срабатывает.

В случае срабатывания системы мы будем перебирать все недавно разрушенные городские объекты и все unitsGroup, которые являются объектами, имеющими компоненты Group, Target и Obstacles, но не имеющие компонента Retreating. Это означает, что это юниты в активном бою, и нам нужно проверить, нужна ли им новая цель, потому что цель, которая у них есть, уже уничтожена. Мы также проверяем, является ли свежеуничтоженная цель первым препятствием, если это так, мы сократим список препятствий.

Теперь, где логика, которая находит цели для групп юнитов, спросите вы.

Эта логика необходима в нескольких системах, поэтому она была представлена ​​как отдельная службаTownObjectTargetFinder, у которой есть функция, findTownObjectTargetForGroup которую мы можем вызывать. Функция получает сущность, представляющую группу юнитов, и возвращает сущность объекта города на основе приоритета атаки группы юнитов и ближайшего неразрушенного здания.

Это оно! Далее идет FindGroupTargetOnDeploymentSystem 💪.