Доработал ИИ призраков
Во время людума я хотел чтобы призраки умели самостоятельно добираться до врагов даже если те находятся не в прямой доступности, а где-то на платформах. Быстро это сделать не получилось, поэтому я добавил кнопку призыва приведений к игроку.
Сейчас времени у меня достаточно, поэтому я решил снова подумать, что с этим можно сделать.
Ранее мне доводилось слышать про A* алгоритм и построение графа перемещения, но я пока плохо представляю как все это делать поскольку в тему не погружался. Когда-нибудь я изучу этот вопрос, но пока что нужен способ проще.
Первым решением была способность телепортироваться к выбранной цели. Благодаря телепортации, приведение сможет без проблем дотянуться до врагов, где бы они не находились да и за игроком следовать будет проще.
Как я уже упомянул, на людуме сделать это не вышло. Причиной было непонимание как определять когда можно телепортироваться, а когда нет. Можно смотреть на расстояние по оси Y до цели и если оно выше какого-то минимального порога, то делать скачек. Но что если игрок находится в прыжке? Как определить висит ли он в воздухе или стоит на платформе?
В компоненте RigidBody, описывающем физические параметры объекта, хранятся вектора приложенных сил и вектор текущей скорости. Поскольку прыжок реализован через импульс, а бег через обычное смещение координат в зависимости от времени, то я решил смотреть на значение вектора скорости. Если вектор ненулевой, значит возможно цель висит в воздухе, поэтому лучше подождать.
Для эффектности я нарисовал анимированные клубы дыма, которые появляются в точках откуда и куда призрак переместился.
Ну и напоследок, мне также не нравилось, что всех врагов нужно провоцировать своим лицом и терпеть пока не добегут союзники, поэтому призракам с копьями я дал возможность телепортации к врагу даже если он стоит на том же уровне. Полностью проблему не решило, но стало чуть получше.
На самом деле была еще одна проблема: как понять с какой стороны к цели можно переместиться? Вдруг противник стоит на краю платформы и выбрав неверную сторону призрак сразу же упадет. Можно конечно прям в координаты цели телепортировать, но это как-то некрасиво.
Для решения этой проблемы я привязал к каждому юниту по набору из двух коллайдеров по бокам и скрипту, который слушает их коллизии и проверяет, нет ли там столкновения с твердым статичным объектом. Если есть, то значит с этой стороны подступиться можно, а если нет, то нужно проверить другую. Если земли нет с обеих сторон, то тогда уже придется перемещаться по координатам самой цели, но это скорее исключение, потому что таких коротких платформ я ставить не планировал.