Мои Уведомления
Привет, !
Мой Аккаунт Мои Финансы Мои Подписки Мои Настройки Выход
Руководство API скрипты

Внутренняя работа навигационной системы

Когда вы хотите разумно перемещать персонажей в своей игре (или агентов, как их называют в кругах ИИ), вам нужно решить две проблемы: как рассуждать об уровне, чтобы найти пункт назначения, тогда как туда переместиться. Эти две проблемы тесно связаны, но совершенно различны по своей природе. Проблема рассуждений об уровне более глобальна и статична, поскольку она учитывает всю сценуСцена содержит среды и меню вашей игры. Думайте о каждом уникальном файле сцены как об уникальном уровне. В каждой сцене вы размещаете свое окружение, препятствия и декорации, по сути проектируя и создавая свою игру по частям. Подробнее
См. в Словарь
. Движение к месту назначения является более локальным и динамичным, оно учитывает только направление движения и способы предотвращения столкновенийСтолкновение происходит, когда Физический движок обнаруживает, что коллайдеры двух GameObject соприкасаются или перекрываются, когда хотя бы один из них имеет компонент Rigidbody и находится в движении. Подробнее
См. в Словарь
с другими перевозчиками.

Места для прогулок

Навигационной системе нужны собственные данные для представления проходимых областей в игровой сцене. Области для ходьбы определяют места в сцене, где агент может стоять и двигаться. В Unity агенты описываются как цилиндры. Проходимая зона строится автоматически из геометрии сцены путем проверки мест, где может стоять агент. Затем локации соединяются с поверхностью, лежащей поверх геометрии сцены. Эта поверхность называется навигационной сеткойосновным графическим примитивом Unity. Меши составляют большую часть ваших 3D-миров. Unity поддерживает триангулированные или четырехугольные полигональные сетки. Поверхности Nurbs, Nurms, Subdiv должны быть преобразованы в полигоны. Подробнее
См. в Словарь
(сокращенно NavMesh).

NavMeshСетка, которую Unity создает для аппроксимации пешеходных зон и препятствий в вашей среде для поиска пути и управления ИИ. навигация. Подробнее
See in Словарь
хранит эту поверхность в виде выпуклых многоугольников. Выпуклые многоугольники являются полезным представлением, поскольку мы знаем, что между любыми двумя точками внутри многоугольника нет препятствий. Помимо границ полигонов, мы храним информацию о том, какие полигоны являются соседями друг друга. Это позволяет нам рассуждать обо всей пешеходной зоне.

Поиск путей

Чтобы найти путь между двумя точками в сцене, нам сначала нужно сопоставить начальную и конечную точки с ближайшими к ним полигонами. Затем мы начинаем поиск из начального местоположения, посещая всех соседей, пока не достигнем полигона назначения. Отслеживание посещенных полигонов позволяет нам найти последовательность полигонов, которая приведет от начала к месту назначения. Распространенным алгоритмом поиска пути является A* (произносится как «звезда»), который использует Unity.

По пути

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

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

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

Обход препятствий

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

Обход препятствий выбирает новую скорость, которая балансирует между движением в нужном направлении и предотвращением будущих столкновений с другими агентами и краями навигационной сетки. Unity использует препятствия с обратной скоростью (RVO) для прогнозирования и предотвращения столкновений.

Перемещение агента

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

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

После того, как агент был перемещен любым способом, смоделированное местоположение агента перемещается и ограничивается NavMesh. Этот последний небольшой шаг важен для надежной навигации.

Глобальный и локальный

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

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

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

Два примера препятствий

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

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

Изменение NavMesh называется вырезанием. Процесс определяет, какие части препятствия касаются NavMesh, и вырезает отверстия в NavMesh. Это ресурсоемкая операция, что является еще одной убедительной причиной, по которой движущиеся препятствия следует обрабатывать с помощью предотвращения столкновений.

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

Описание ссылок вне сетки

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

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

Вы можете отблагодарить автора, за перевод документации на русский язык. ₽ Спасибо
Руководство Unity 2021.3