О препятствиях

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

В иерархии преобразования есть по крайней мере один объект, у которого есть MeshFilter с сеткой, назначенной среди его компонентов
Transform.scale > 0 in x,y and z

Nav3D обрабатывает препятствия следующим образом:

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

Наше использование оптимального графика, основанного на октодереве, дает значительно более высокую скорость поиска пути, чем использование классического сеточного графика.

Для вашего удобства существуют три основные операции по управлению препятствиями:

Добавьте препятствие. Препятствие добавляется в хранилище препятствий Nav3D и будет учитываться при поиске пути. В этом случае уже найденные пути будут обновлены. Желательно использовать для препятствий, которые появляются на сцене.
Обновите препятствие. График проходимости будет обновлен в соответствии с измененными характеристиками преобразования препятствия. Рекомендуется использовать, если препятствие изменило свое положение, размер или поворот.
Устраните препятствие. Препятствие будет удалено из хранилища препятствий Nav3D и больше не будет учитываться при поиске путей агентами.

О поиске пути

Для поиска пути в игровом пространстве используется модификация алгоритма A*.

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

О локальном избегании

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

Локальное избегание в нашей реализации основано на алгоритме ORCA.

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

Системы передвижения и восприятия агента

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

При перемещении по найденному пути и выполнении локального обхода у каждого агента есть несколько векторов для перемещения:

Вектор движения по найденному пути
Вектор избегания от ближайших агентов
Вектор уклонения от близлежащих препятствий

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

Поддающиеся агенты

Наше использование ORCA в качестве локального алгоритма избегания позволило нам создать необычный стиль поведения агентов, который может быть полезен в некоторых игровых сценариях. Мы называем их “податливыми агентами”. У них нет собственной цели передвижения, и они просто стараются не мешать передвижению других агентов.

Команды для агентов

Чтобы использовать агентов в ваших игровых сценариях, у вас есть три варианта заказов:

  • Перейти к точке; Агент прервет текущий заказ (если таковой имеется) и начнет поиск пути и движение к точке
  • Преследуйте движущуюся трансформацию (будь то другой агент или любой другой движущийся объект в игре). Агент прервет текущий заказ и начнет преследовать движущуюся цель
  • Переходите к точке по очереди. Агент начнет движение к указанной точке сразу после достижения текущей преследуемой точки. Если агент следует приказу преследовать движущееся преобразование, то он прервет его и начнет следовать к точке. Любое количество очков может быть поставлено в очередь движения к точке.