Представлена сцена в Unity, по которой передвигается зеленый куб, управляемый игроком мышкой, и синяя капсула, которая всегда следует за кубом. Они перемещаются по белому плейну вокруг красных препятствий.   Была сгенерирована навигационная сетка. На зеленом кубе содержатся компоненты NavMeshAgent и PlayerNavigation. Синей капсуле NavMeshAgent и TargetNavigation. На красных кубак компонент NavMeshObstacle.   Немного теории. Область навигации в Unigine можно задать двумя способами: навигационным мешем (Navigation Mesh) и навигационным сектором (Navigation Sector), с возможностью построения маршрута в 2D и 3D пространстве (при поиске 2D маршрута координата Z не учитывается). Навигационный меш - область в виде загружаемого полигона меша. Важно учитывать, что поиск пути происходит только в пределах одного навигационного меша. Возможность перехода на другой навигационный меш или сектор при поиске пути не поддерживается, так же доступно построение только 2D маршрута. Сам меш не генерируется автоматически и его нужно загружать в виде 3D модели. Подробнее про Navigation Mesh Навигационный сектор - область в виде куба. Он поддерживает возможность построения пути между несколькими секторами и построение 2D и 3D маршрутов. Чтобы маршрут был составлен между несколькими секторами, нужно выставить радиус и высоту маршрута достаточными, чтобы точка маршрута могла поместиться в области пересечения секторов. Подробнее будет рассмотрено ниже. Подробнее про Navigation Sector Obstacle (препятствия) заставляют огибать область в форме куба, сферы или капсулы маршрут во время поиска пути. Подробнее про Obstacle Создаем мир и обустраиваем его по аналогии со сценой Unity. Создаем навигационной сектор Create -> Navigation -> Navigation Sector. Располагаем его выше плейна и изменяя Size в окне Parameters, устанавливаем размер сектора в форме уровня.   Создаем красные кубы, внутри них создаем препятствия Create -> Navigation -> Obstacle Box.   Чтобы постоянно отображать зоны сектора и препятствий, можно включить хелперы. PathRoute позволяет найти точки пути маршрута между A и B с помощью двух методов: Create2D(vec3 A, vec3 B) и Create3D(vec3 A, vec3 B). Задав маски для сектора (навигационного меша) и препятствия, можно фильтровать поиск маршрута. Маршруту можно задать радиус и высоту. Если сектор или пересечение секторов меньше, то они будут исключены из поиска пути. Теперь создадим навигационного агента. Зададим базовые поля для нашего агента: скорость, поворот, радиус, высоту, расстояние до остановки и маски. Важно отметить, что данный скрипт будет работать только для навигационного меша или в пределах одного сектора! Зададим три приватных поля для внутренней работы скрипта.  Первый метод InitRoute будет задавать значение полям класса PathRoute при изменении извне.  И вызываем его в методе Init и Update.   Дабы иметь возможность в самом приложении отображать маршрут, создадим метод RenderVisualizer и вызовем его в методе Update. Само отображение можно включить, прописав в методе Init “Visualizer.Enabled = true;” или введя консольную команду “show_visualizer 1”. Создадим метод построения маршрута SetDirection. Первый аргумент будет принимать конечную точку маршрута, второй аргумент автоматический пересчет маршрута. Последний метод агента будет двигаться по пути следования маршрута. Создадим метод MoveDirection. Вначале будем проверять, что маршрут построен и расстояние до конечной точки удовлетворяет условию. Далее определим вектор направления движения между двумя актуальными точками маршрута и проверим, что он еще актуален. Теперь сделаем поворот в направлении движения. Методом MathLib.SetTo получим матрицу и из нее quat направления движения. Затем методом MathLib.Slerp будем плавно изменять поворот ноды агента.   Заставим ноду переместиться вперед относительно себя.   В конце проверим, нужен ли перерасчет поиска пути.   Вызовем этот метод в методе Update между InitRoute и RenderVisualizer. Теперь можно добавить этот скрипт к зеленому кубу и синей капсуле. Создадим скрипт TargetNavigation, который позволит синей капсуле следовать за зеленым кубом. Автоматический перерасчет в NavigationAgent нам не нужен, так как наша точка следования постоянно изменяется, поэтому вызываем метод SetDirection в PostUpdate. Создаем последний скрипт PlayerNavigation, который будет указывать точку следования с помощью мыши. Необходимы три поля: навигационный агент, пересечение и камера. В методе Init указываем агента и камеру. Также делаем курсор мыши постоянно видимым.   Создаем метод, который будет пускать луч, в точке соприкосновения которого будет указывать движение зеленому кубу.   В методе Update вызываем метод MoveNavigation при нажатии ЛКМ.   Теперь добавляем скрипт TargetNavigation синей капсуле и PlayerNavigation зеленому кубу. Так же рекомендуется красным кубам, синей капсуле и зеленому кубу выключить Intersection в окне Parameters, чтобы лучу ничего не мешало и он работал только на плейне. Теперь можно запустить.   Финальный результат проделанной работы. Официальный сайт Unigine Документация Unigine