Нахождение траектории отражения пули для ИИ (Unity)

Суть такая: есть игра, в которой каждый выпущенный снаряд отражает от поверхности n раз. Проблема: найти метод которым можно заставить ИИ стрелять в нужном направлении, чтобы снаряд летел в позицию игрока. Найти нужно именно синие линии

Проблемы с наведением ИИ в сторону игрока (зеленая линия) нет, проблем с отражением самой пули тоже нет. Есдинственная проблема - алгоритм нахождения нужной точки, в которую нужно выстрелить, чтобы отраженный снаряд попал в игрока. Единственный вариант который я вижу на данный момент - заранее сделать Raycast вокруг обьекта ИИ, отразить лучи от поверхности и вернуть только те, что после отражения попали в игрока. Но такая реализация кажется мне слишком нагруженной, тем более для мобильных устройств. Возможно существует более оптимальный метод для таких рассчетов, или у вас есть идеи лучше, буду очень признателен


Ответы (2 шт):

Автор решения: Швеев Алексей

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

UPDATE:

Значит получается такой алгоритм:

  • проходимся для каждой стенки
  • Если эта стенка не находится между целью и пушкой (другими словами: если при проведении линии между пушкой и целью она не пересекается с текущей стеной) то
  • Отзеркаливаем позицию цели относительно текущей стенки
  • измеряем угол между пушкой и целью.
  • пускаем этот луч и проверяем, не сталкивается ли он с какой либо стеной Полученный массив углов будет являться набором всех возможных вариантов при одном отражении. Если нам надо больше отражений, то на каждое отзеркаливание позиции цели нам надо ее еще раз отзеркаливать относительно стенок, которые мы тоже должны отзеркалить Звучит сложно, но надеюсь понятно)
→ Ссылка
Автор решения: Mistraell

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

UPD

Для лучшего понимания:

центральная картинка - оригинал

синий пунктирный луч - направление зеркальной копии к оригинальному игроку

зеленый пунктир - отраженный луч зеркальной копии

→ Ссылка