Как лучше сделать навмеш для многоуровневого ландшафта?
я сделал ландшафт 4 на 4 части по 750 на 750 метров каждая. У каждого свой Navmesh, привязанный только к этой части ландшафта.
Сделал всем build path, предварительно загрузив их и выделив.
Когда бот, привязанный к корневому уровню persistent level, перемещается по всей карте, встречаются такие части ландшафта, на которых он не видит Navmesh. И на них он не может найти путь.
Когда я попробовал сделать один большой общий Navmesh на все подуровни, то build path построил мне пути на нём (зелёную зону перемещений) только на небольшом круге посередине большого.
Как лучше сделать, чтобы пути искались на всей карте и не терялись?
Предположу:
1) бот просто не может переключиться с обного навмеша на другой, когда переходит между маленькими навмешами. Хотя в 7 из 8 случаев проблем с этим не испытывает.
2) в варианте с одним навмешем на все подуровни, я что -то не донастроил, поэтому он не хочет считать всю карту.
ЗЫ Динамический навмеш плохо работает, поэтому использую вариант Dynamic Modifiers Only. Это почти static, но с возможностью подключать модификаторы.
Кто может подсказать решение? Отзовитесь пожалуйста.
поставил 2х ботов на разные подуровни карты. Оба бегут к персонажу, но не переходят через границу подуровней.

тут видно как бот добегает до границы одного подуровня и останавливается, а другой бежит по нему, но останавливается при переходе на другой. И наоборот.
но это только в этом месте. На других границах такого нет, но бывают другие места, где так же.
То есть навмеши работают на каждом подуровне, но нет переключения у ботов при переходе с одного на другой. Вернее есть, но не всегда.
Поставил ботам галку "can affect Navigation Generation". Сразу не помогло. Сделал нахлёст навмешей по 2 метра в каждую сторону (итого 4 метра общей территории на соседних навмешах). Перестроил пути. Конкретно в этом мете дефект ушёл.
При этом раньше нахлёст был по 100 метров ( по 200 метров в сумме общей площади на навмешах) - не помогало.

Пока сильно не уверен, что проблеммы не вылезут в другом месте.
пробежал с ботами почти всю карту - заеданий не было.
Из принятых мер было:
1 Перенос всех навмешей на верхний общий уровень Persistent Level
2 Включение ботам "can affect Navigation Generation".
3 Нехлёст навмешам по 2 метра каждому и перестройка путей.
Подозреваю, что что-то здесь лишнее.
Хотелось бы чтобы всё работало без п.1
ЗЫ решение тут
https://gamedev.ru/unreal/forum/?id=283795&m=5912755#m12
Тебе не надо ботам включать can affect navigation - Nav mesh не должен перестраиваться при движении ботов.
Используй Detour Crowd AI Controller


И давно нужно на пятый Unreal Engine переходить.
Используй Detour Crowd AI Controller
У него совсем другое предназначение.
И давно нужно на пятый Unreal Engine переходить.
Переходить желательно, но не обязательно.
Как лучше сделать навмеш для многоуровневого ландшафта?
Это нигде не документировано. Смотрите класс UWorldPartitionNavigationDataBuilder. Это пример как сделать бесшовную навигацию, которая генерируется заранее (static) и стримится в рантайме.
Если у вас нет квалитфикации (с++), то можно попробывать сетап с форума.
Альтернатива сделать динамический с инвокерами. Работает из коробки.
inc_ani
> Альтернатива сделать динамический с инвокерами. Работает из коробки.
выглядит убого у меня. Движения резкие, обрывистые, не плавные. По пути свернёт раз 10 в разные стороны. Видимо просчитывает динамику на больших размерах плохо. Конечно можно сделать динамическую область инвокеру на рекомендуемые 30 - 50 метров, но представь, геймер спрыгнул с горы и не разбился. А что будет делать бот, который прыгать не умеет? Ему придётся оббегать. А куда оббегать, если у него динамическая область 50 метров. Обходной путь может составить 700 метров туда, 700 метров обратно... Сделай 700 и увидишь как его начнёт колбасить. У меня железо не Айс, но 8 ядер i7-9700F, rx-6600 на 8 gb видеопамяти и 32 gb ОЗУ (2х16). У игры тормозов нет, но бота начинает дёргать, даже на таком железе.
ivashko
Динамика или статика на "качество" движения бота никак не влияет.
inc_ani
> Динамика или статика на "качество" движения бота никак не влияет.
если динамика успевает перестраивать навмеш... и если его размеров хватает.
inc_ani
> У него совсем другое предназначение.
Зачем он делает can affect Navigation Generation для ботов?
Зачем он делает can affect Navigation Generation для ботов?
Вы подумали он это делает, чтобы боты обходили друг друга? Не проверял, но для статического навмеша это не должно работать.
А для ботов есть 2 варианта RVO и/или Detour Crowds.
если динамика успевает перестраивать навмеш...
Ну тут надо правильно инвокерами пользоваться. Чтобы он не перестраивал постоянно тайлы. Строит он достаточно шустро.
и если его размеров хватает.
Это конфигурируемо. Можно использовать 2 навмеша, один точный, но небольшой площади, второй глобальный но с большими тайлами (или вообще вейпоинты). А если карта достоточно открытая (без лабиринтов), то достаточно просто идти до крайней точки.
По-моему опыту получить хорошее решение без модификации навигационной системы не получиться. Учите с++ или найдите программиста.
Тут упоминается NavMesh Data Chunk Streaming, попробуйте поискать в этом направлении.
Blueprint
> Зачем он делает can affect Navigation Generation для ботов?
вообще-то это прорезает дырки в навмеше, но в моём случае это повлияло на переключение бота с одного навмеша, на другой. ( без этого переключение иногда заедало)
Наверное при прорезании дырок движок делает это во всех навмешах, на которых он стоит, при этом к нему таки проникает информация,что под ним не один, а 2 навмеша. Так бот узнаёт, что дальше есть навмеш , и по нему тоже можно ходить. В результате бот строит маршрут по обоим навмешам, пока не соскочит с первого. Но соскочив с первого, он не остаётся без навмеша и бежит по второму.
ЗЫ это были только мои догадки, но именно это мне помогло избавиться от застреваний ботов на границах соседних навмешей.
ЗЗЫ проще говоря can affect Navigation Generation принудительно "активирует" навмеш, если он не хочет "активироваться" сам, когда на него приходит бот. Но в документах это не написано. Чисто мои домыслы.
Всем спасибо за советы. Когда-нибудь ещё понадобится может быть.
Пока решил простым методом.
п1. приводит к долгой загрузке игры.
(https://gamedev.ru/unreal/forum/?id=283795&m=5912311#m3)
но его можно убрать так:
1-привязываем навмеши к подуровням ( каждый к своему)
2-дополнительно делаем маленький навмеш и помещаем этот кубик высоко над остальными, чтобы не пересекался ни с кем.
3- вот этот маленький навмеш привязываем к корневому уровню Persistent Level
4-выделяем все подуровни и делаем им Build Paths.
Всё. Теперь будут загружаться навмеши только открытых подуровней и при переходе с подуровня на подуровень не будут зависать боты.
При этом:
-"can affect Navigation Generation" включена у ботов, путешествующих по всем навмешам.
-у навмешей нахлёст друг на друга каждый по 2 метра ( в сумме 4)
Проверено, работает и не замедляет загрузку игры больше чем надо.
Как сделать, чтобы навмеш сохранялся не только на время работы в редакторе UE, но и для повтрного запуска UE после его выключения.
У меня сработалро так:
-Выровнял все навмеши по высоте и вертикальной шкале.
-тот "маленький" навмеш, который "ничего не касался" и был привязан к Persistent Level, вытянул по ширине на весь ландшафт, но по высоте оставил его так, чтобы не касался ничего на ландшафте, но чтобы он пересекал все верхушки остальных (рабочих) навмешей.
-удалил RecastNavmesh
-выделил все подуровни ( они уже загружены) и сделал всем Build Paths.
(построился новый RecastNavmesh )
Нажал сохранить всё (и заодно в меню файл- сохранить все уровни.)
Теперь после перезапуска UE все навмеши остались сохранёнными.
ЗЫ: Этот пост появился из-за того, что после перезапуска UE навмеши не сохранялись и приходилось каждый раз перестраивать пути. Тут описан не рецепт, а личный опыт, найденный из проб и ошибок, а не по документации.
Если кто знает как делать по техдокументации - добро пожаловать, пишите как надо по документам.
Тема в архиве.