Данная запись сделана прежде всего чтобы не забыть до следующего раза как это делается и, возможно, повеселить/напугать тех кто это прочитает. Это ни в коем случае не туториал - даже не пытайтесь повторить в домашних условиях, не понимая что и зачем делается.

Постановка задачи

Необходимо реализовать механизм, позволяющий морпеху автоматически атаковать противника в конце хода. Дальность атаки до двух клеток, атакуется всегда ближайший противник, стрелять можно только прямо перед собой, союзники не блокируют атаку. Каждая атака состоит из двух отдельных выстрелов по цели.
На атаку влияют следующие модификаторы:
  • "стимпак": добавляет еще один выстрел к атаке, длится один ход (бонус персональный для юнита, на улучшения можно даже не смотреть).
  • "усиление": повышает наносимый урон на 1 за каждый уровень усиления (бонус персональный для юнита, на улучшения можно даже не смотреть).

Имеющиеся системы

  • Передача хода от игрока к игроку, а также персональный индикатор хода для каждого юнита.
  • Запуск любого эффекта(effect) в конце хода игрока применительно к конкретному юниту, требует наличия у юнита соответствующего бафа-алгоритма(behavior).
  • Запуск любого эффекта в конце и/или начале хода применительно ко всем юнитам игрока.

Реализация

Нанесение урона

  • Прежде всего определимся с возможной величиной урона за один выстрел и создадим отдельный эффект нанесения урона(Effect - Damage) под каждое значение. Настроим эти эффекты так, как нам надо: тип атаки - дальний бой, снижение урона на единицу брони - 1. Получим несколько эффектов нанесения урона, отличающихся только величиной наносимого урона.
  • Для каждого уровня бафа "усиление" создадим валидатор с условием "больше или равно". Укажем целью валидатора источник эффекта (Source) чтобы проверялся уровень бафа у морпеха или любого другого использующего этот эффект юнита, а не у цели. Получим валидаторы, позволяющие ограничить какие-либо действия проверкой на выполнение соответствующего условия.
  • Сгруппируем полученные эффекты нанесения урона с помощью эффекта выбора (Effect - Switch) и назначим каждому из них соответствующие валидаторы, важно учитывать порядок эффектов в списке - проверка выполняется сверху вниз и активируется первый эффект, валидатор которого выдал true. Получим эффект, который будет использовать различные эффекты нанесения урона в зависимости от уровня бафа "усиление"
С непосредственным нанесением урона и его изменением в зависимости от различных условий разобрались,

Стрельба по цели

  • Для того чтобы произвести несколько выстрелов по цели можно использовать эффект цикла (Effect - Create Persistent). Создадим два таких - один для обычной атаки, а второй - для атаки под стимпаком, отличающийся на 1 количеством тактов. Укажем эффект выбора из предыдущего раздела в качестве периодического эффекта в цикле, также стоит задать задержку между тактами и другие параметры цикла.
  • Создадим валидатор, проверяющий наличие бафа стимпака.
  • Создадим еще один эффект выбора, в этот раз выбирающий между двумя ранее созданными эффектами цикла на основе последнего созданного валидатора. Получим эффект, наносящий цели различное количество ударов в зависимости от наличия бафа "стимпак", а с учетом предыдущего раздела, наносимый урон будет изменяться в зависимости от наличия и уровня бафа "усиление".

Поиск цели

Для поиска цели будем использовать еще один цикл (Effect - Create Persistent), а также эффект поиска цели (Effect - Search Area).
  • Объединим в одном эффекте (Effect - Set) два эффекта - эффект выбора из предыдущего раздела и эффект прерывания цикла, который создадим позже.
  • Эффекту поиска цели укажем радиус 1, точку приложения Target Point и фильтр целей "только враги", при необходимости можно указать более подробный фильтр. В качестве эффекта, применяемого к каждой найденной цели укажем предыдущий эффект. Получим эффект, перебирающий всех врагов в указанной точке и выполняющий атаку по ним.
  • Создадим эффект цикла и прерывающий эффект для него. Укажем количество тактов 2 и последний созданный эффект поиска цели в качестве периодического эффекта, также зададим относительные смещения для каждого такта. Получим эффект атаки, который полностью соответствует исходным требованиям.

Использование

Чтобы созданный эффект стал атакой морпеха необходимо проделать еще несколько шагов:
  • скопировать существующую заготовку "действия, выполняемые в конце хода" (благо редактор позволяет скопировать все нужные эффекты и бафы за один раз, при этом копии объектов будут ссылаться сразу друг на друга, а не на оригиналы)
  • изменить названия, иконки и описания скопированных эффектов и бафов (найти их также очень просто благодаря списку связанных объектов)
  • указать наш эффект в качестве эффекта действия (фактически - добавить его в скопированный эффект типа Set)
  • добавить скопированный эффект типа Remove Behavior в существующий эффект системы, отвечающей за активацию всех действий, выполняемых в конце хода.
  • выдать морпеху скопированный баф, отвечающий за активацию действия в конце хода.

Дополнительные красивости

  • Можно добавить выдачу бафа "наведение на цель" перед запуском этого эффекта (с помощью Effect - Set и дополнительной задержки в цикле наведения), а также удаление этого бафа дополнительным тактом в конце каждого цикла. В результате использующий этот эффект юнит будет получить баф "наведение на цель" непосредственно перед началом атаки и терять его сразу после ее завершения - удобно использовать для анимаций и любых других целей.
  • Можно и нужно настроить актеров/агентов морпеха и атаки морпеха таким образом чтобы морпех проигрывал анимацию атаки, а актер атаки отображал вспышку от выстрела на стволе и анимацию получения урона на цели.

Заключение

Для тех кто дочитал до сюда и задался вопросом "а зачем все это?": морпех, как и все фигуры на доске в пошаговой игре, не обладает стандартной атакой, а значит не получится использовать предоставляемую движком систему атаки. Да, я пробовал реализовать то-же самое, но с использованием управляемой атаки вместо использования эффектов напрямую, это намного проще, но стабильность работы и расширяемость такой системы оставляет желать лучшего. И главное - для управляемой атаки нужна масса триггеров, а здесь чистая работа с РО.
а вот так это выглядит при просмотре иерархии связанных объектов в редакторе