Преодоление препятствий

Создание препятствий

После завершения инициализации вы можете приступить к обработке (регистрации) препятствий в игровой сцене.

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

Каждая ячейка октодерева проверяется на пересечение по крайней мере с одним треугольником из сетки препятствий. Если есть пересечение, то ячейка графика помечается как непроходимая, в противном случае это возможно. Затем, на основе свободных ячеек октодерева, строится граф возможностей (он же график навигации или поиска пути).

Препятствия — это любые игровые объекты (GameObject) на сцене, которые активны (свойство GameObject.activeInHierarchy = true) и имеют компонент MeshFilter (для самих себя или для членов их иерархии преобразования) с назначенным полем сетки.

Существует три типа операций для работы с препятствиями, все они реализуются асинхронно:

  • Добавление: Выполняет первичную обработку препятствий. Необходимо выполнить для препятствий, которые появились на игровой сцене после инициализации Nav 3D, или для тех, которые еще не были обработаны. Регистрирует препятствие или несколько препятствий на графике поиска пути. Без вызова этого метода поиск пути на сцене никоим образом не будет учитывать препятствие.
  • Удаление: Удаляет препятствие из графика поиска. Должны быть вызваны препятствия, которые вы собираетесь уничтожить или отключить в сцене, чтобы они больше не учитывались при поиске пути.
  • Обновление: Обновляет измененное препятствие на графике. Метод необходимо использовать в случае, если препятствие было изменено после регистрации, например, оно изменило свой масштаб, поворот или положение, или произошли изменения среди членов иерархии преобразования (например, некоторая дочерняя сетка перестала существовать). Фактически, он устраняет препятствие, а затем повторно добавляет его в график поиска, но с некоторой оптимизацией. Мы не рекомендуем злоупотреблять вызовом этого метода (было бы плохой идеей вызывать его при каждом запуске обновления), поскольку его выполнение занимает значительное количество времени, по аналогии с операцией добавления.