Unity3DInRus

NavigationAreasAndCosts

Навигационные Области и Стоимость

 

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

На приведенном выше примере типы области используются для двух распространённых случаев использования:

  • Область воды (Water) сделана более затратной для ходьбы путем назначения ей большей стоимости, для реализации сценария, где передвижение по мелководью происходит медленнее. 
  • Область двери (Door) сделана доступной только для конкретных персонажей, чтобы создать сценарий, где люди могут проходить через двери, а зомби нет.

Каждому объекту, включенному в запекание NavMesh, можно назначить тип области, более того, каждая связь Off-Mesh Link имеет свойство для указания типа области.

Стоимость Поиска Пути

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

Чтобы полностью понять как работает стоимость, давайте рассмотрим работу поиска пути..

Nodes and links visited during pathfinding.
Узлы и связи, посещаемые во время поиска пути..

Unity использует алгоритм A* (эй стар) для расчёта кратчайшего пути на NavMesh. A* работает на графике связанных узлов. Алгоритм начинает работу от ближайшего от начала пути и посещает соединённые узлы до достижения точки назначения .

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

Жёлтые линии и пунктом на изображении выше показывают, как на NavMesh располагаются узлы и связи, и в каком порядке они приходятся во время выполнения алгоритма A*.

Стоимость перемещения между двумя узлами зависит от расстояния перемещения и цены, которая зависит от типа области полигона под связью, и вычисляется по формуле: расстояние * цена. На практике это означает, что если цена области равна 2.0, то расстояние через такой полигон будет представляться в 2 раза длиннее. Алгоритму A* требуется чтобы все затраты были больше 1.0.

Влияние затрат на итоговый путь может быть трудно предсказуемо, особенно для длинных маршрутов. Лучший способ приблизительно оценить затраты - использовать их как подсказки. Например, если вы не хотите, чтобы агенты слишком часто пользовались off-mesh link,  вы можете увеличить их стоимость. Но может будет проблемной настроить поведение, где агенты предпочитаю ходить по тротуарам.

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

Стоимость типа области может быть установлена глобально на вкладке Areas, или можете переопределить её для каждого агента с помощью скрипта.

Типы области

The area types are specified in the Navigation Window’s Areas tab. Типы области задаются на вкладке Areas окна Navigation. Есть 29 пользовательских типа и 3 встроенных: Walkable, Not Walkable, Jump.

  • Walkable - это универсальный тип области, который определяет, что область проходима.
  • Not Walkable - это универсальный тип области, который препятствует навигации. Это полезно для тех случаев, когда вы хотите пометить объект как препятствие, но без попадания NawMesh наверх него.
  • Jump - это тип области, который назначается всем автоматически создаваемым off-mesh link.

Если несколько объектов с разными типами области пересекаются, то итоговый тип области NavMesh обычно становится тот, у которого выше индекс. Однако есть одно исключение: Not Walkable всегда имеет приоритет. Это пригодится если вам понадобится заблокировать область.

Маска области

У каждого агента имеется маска области, которая описывает, какие области он может использовать во время навигации. Маска области может быть задана в свойствах агента, или bitmask может управляться, используя скрипт во время выполнения.

Маска области полезна, когда вы хотите чтобы только определённые типы персонажей  были способны проходить через некую область. Например, в игре "уклонение от зомби" вы можете пометить область под каждой дверью как тип doorArea,  и отключить этот тип в маске области персонажей зомби.

Сегодня были уже 4 посетителей (6 хитов) здесь!
Этот сайт был создан бесплатно с помощью homepage-konstruktor.ru. Хотите тоже свой сайт?
Зарегистрироваться бесплатно