Все заметки

Доработал ИИ призраков

Во время людума я хотел чтобы призраки умели самостоятельно добираться до врагов даже если те находятся не в прямой доступности, а где-то на платформах. Быстро это сделать не получилось, поэтому я добавил кнопку призыва приведений к игроку.

Сейчас времени у меня достаточно, поэтому я решил снова подумать, что с этим можно сделать.

Ранее мне доводилось слышать про A* алгоритм и построение графа перемещения, но я пока плохо представляю как все это делать поскольку в тему не погружался. Когда-нибудь я изучу этот вопрос, но пока что нужен способ проще.

Первым решением была способность телепортироваться к выбранной цели. Благодаря телепортации, приведение сможет без проблем дотянуться до врагов, где бы они не находились да и за игроком следовать будет проще.

Как я уже упомянул, на людуме сделать это не вышло. Причиной было непонимание как определять когда можно телепортироваться, а когда нет. Можно смотреть на расстояние по оси Y до цели и если оно выше какого-то минимального порога, то делать скачек. Но что если игрок находится в прыжке? Как определить висит ли он в воздухе или стоит на платформе?

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

Для эффектности я нарисовал анимированные клубы дыма, которые появляются в точках откуда и куда призрак переместился.

Ну и напоследок, мне также не нравилось, что всех врагов нужно провоцировать своим лицом и терпеть пока не добегут союзники, поэтому призракам с копьями я дал возможность телепортации к врагу даже если он стоит на том же уровне. Полностью проблему не решило, но стало чуть получше.

На самом деле была еще одна проблема: как понять с какой стороны к цели можно переместиться? Вдруг противник стоит на краю платформы и выбрав неверную сторону призрак сразу же упадет. Можно конечно прям в координаты цели телепортировать, но это как-то некрасиво.

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