Создание навигационной сетки в сцене 3DGS
Navigation System Support
Область применения
Этот документ рассчитан на сцены, где навигация строится по данным коллизий LCC, поэтому он применим только к ALCCActor и ALCC2Actor: собственные данные коллизий есть только у форматов .lcc и .lcc2, см. Коллизии.
.sog, .spz и .ply данных коллизий не содержат, поэтому проходимые области нужно строить самостоятельно с помощью Blocking Volume или приблизительного меша. Такая геометрия состоит из стандартных объектов UE, и навигация настраивается по официальному процессу Unreal Engine, который не касается особенностей этого документа.
Обзор
Navigation System в Unreal Engine предоставляет AI-персонажам проходимые области через NavMesh. Создание NavMesh опирается на геометрию сцены, которая может влиять на навигацию и имеет корректные коллизии.
Коллизии LCC загружаются динамически по блокам: загружаются только блоки коллизий в пределах определённого диапазона вокруг камеры, и они подкачиваются и выгружаются при движении камеры (о механизме см. Коллизии: механизм загрузки). Это напрямую определяет стратегию настройки навигации:
- Подкачка и выгрузка блоков коллизий во время выполнения запускают перестроение NavMesh и вызывают рывки
- Поэтому коллизии целевой области следует загрузить полностью за один проход, а затем строить навигацию в режиме
Static
Для сцен LCC в качестве Runtime Generation рекомендуется Static. Dynamic постоянно реагирует на изменения коллизий и перестраивает NavMesh, а вместе с блочной загрузкой коллизий это часто запускает перестроение и в больших сценах даёт заметную нагрузку на CPU и рывки.
Предварительные условия
| Условие | Описание |
|---|---|
| Данные содержат файл коллизий | Для .lcc нужен collision.lci (в старых версиях collision.bin); для .lcc2 — файлы .ply в data/mesh/. См. Коллизии: предварительные требования |
| Коллизии включены | У Actor bEnableCollision = true |
| Данные коллизий загружены | Выберите в режиме отображения коллизии игрока или коллизии видимости, чтобы увидеть загруженные тела коллизий |
| Actor может влиять на навигацию | У Actor CanEverAffectNavigation = true |
| Диапазон загрузки коллизий достаточен | Max Load Collision Distance(m) покрывает целевую область, где нужна навигация, по умолчанию 300 метров |
| Границы построения NavMesh достаточны | В сцене размещён NavMeshBoundsVolume и покрывает целевую область, где будет действовать AI |
Дистанция загрузки коллизий и
NavMeshBoundsVolumeуправляют разными диапазонами: первая определяет, в каких областях есть данные коллизий, второй — в каких границах движок строит NavMesh. Чтобы в целевой области появилась пригодная NavMesh, оба должны её покрывать.
Порядок действий
1. Включите и проверьте коллизии LCC
Выберите ALCCActor или ALCC2Actor и включите Enable Collision (bEnableCollision) в панели Details либо включите из кода:
LCCComponent->SetLCCCollisionEnable(true);
Одновременно убедитесь, что у Actor CanEverAffectNavigation = true, чтобы его коллизии могли участвовать в построении навигации.
После загрузки данных LCC выберите в режиме отображения коллизии игрока или коллизии видимости и проверьте, появились ли тела коллизий в целевой области. Коллизии используют асинхронное физическое запекание, поэтому после начала рендеринга изображения 3DGS может потребоваться подождать ещё несколько секунд.

Проверка в режиме коллизий игрока или коллизий видимости, что тела коллизий LCC в целевой области навигации загружены
2. Настройте диапазон загрузки коллизий
Коллизии LCC загружаются только в пределах диапазона, заданного параметром Max Load Collision Distance(m), по умолчанию 300 метров.
При работе с навигацией это значение следует увеличить так, чтобы оно покрывало всю область действия AI, и тогда все коллизии загрузятся за один проход. Иначе во время выполнения блоки коллизий будут постоянно подкачиваться и выгружаться вместе с движением камеры, что непрерывно запускает перестроение NavMesh и вызывает заметные рывки. При достаточно большом диапазоне изменений коллизий во время выполнения больше нет, и навигация не перестраивается.
Плата за это — более долгая загрузка при запуске и повышенный расход памяти. Через Collision Data Usage у stat xgrids можно проверить, приемлема ли память после полной загрузки, см. Коллизии: загрузка всех коллизий за один проход.
Не меняйте Runtime Generation на Dynamic, чтобы обойти недостаточную дистанцию коллизий. Dynamic не расширяет диапазон загрузки коллизий, и в областях за этой дистанцией по-прежнему нет коллизий, пригодных для построения навигации.
3. Разместите и настройте NavMeshBoundsVolume
Разместите в сцене NavMeshBoundsVolume, затем переместите и отмасштабируйте его так, чтобы он покрывал всю область, в которой должен действовать AI.

Размещение и масштабирование NavMeshBoundsVolume, чтобы границы построения навигации покрывали всю область действия AI
Ещё раз убедитесь, что оба диапазона одновременно удовлетворяют требованиям:
- Max Load Collision Distance(m): определяет, есть ли в целевой области загруженные коллизии LCC;
- NavMeshBoundsVolume: определяет, в каких границах Unreal Engine строит NavMesh.
Увеличение только одного из двух диапазонов не решает проблему области, которую не покрывает другой.
4. Настройте Navigation System
| Настройка | Рекомендуемое значение | Описание |
|---|---|---|
| Runtime Generation | Static | Предпочтительная настройка. Навигация создаётся только при построении в редакторе, что избавляет от издержек постоянного перестроения во время выполнения |
| Cell Size | Значение по умолчанию | Чем меньше значение, тем точнее NavMesh, но тем выше время построения, расход памяти и издержки во время выполнения |
Когда всё же использовать Dynamic
Рассматривайте Dynamic только тогда, когда NavMesh действительно должна автоматически перестраиваться вслед за изменением геометрии во время выполнения, например в интерактивной сцене, где проходимые области меняются по ходу.
С коллизиями LCC Dynamic требует особой осторожности: коллизии сами загружаются динамически по блокам, и каждая подкачка или выгрузка блока считается изменением геометрии и запускает перестроение навигации, что в больших сценах может давать непрерывную нагрузку на CPU и рывки. Если Dynamic действительно необходим, одновременно увеличьте диапазон загрузки коллизий так, чтобы он покрывал всю область действия, и избежите изменений коллизий во время выполнения.
Не включайте Dynamic только для того, чтобы увеличить дистанцию коллизий или охват навигации.
5. Дождитесь готовности коллизий и постройте Static NavMesh
При использовании рекомендуемого режима Static действуйте в следующем порядке:
- Загрузите данные LCC и убедитесь, что изображение 3DGS уже отображается.
- Дождитесь завершения асинхронного запекания коллизий.
- В режиме коллизий игрока или коллизий видимости убедитесь, что коллизии в целевой области загружены.
- Убедитесь, что Collision Load Max Distance и
NavMeshBoundsVolumeпокрывают целевую область. - Выполните Build → Build Paths в главном меню Unreal Engine.
- Дождитесь завершения построения навигации.
- Сохраните уровень и данные навигации.
Проверка и устранение неполадок
Нажмите P, чтобы отобразить NavMesh во вьюпорте:
- Зелёные области: проходимая NavMesh создана;
- Нет зелёных областей: в этом месте NavMesh не создана, проверяйте в порядке ниже.

Проверка NavMesh нажатием P; зелёное покрытие означает, что в этой области созданы проходимые данные навигации
Если в целевом месте нет зелёной NavMesh, проверьте по порядку:
- Содержат ли данные коллизии: убедитесь, что используется
.lccили.lcc2и в каталоге данных есть соответствующий файл коллизий; одиночные форматы коллизий не содержат и для этого процесса не подходят; - Включены и загружены ли коллизии: убедитесь, что
bEnableCollision = trueиCanEverAffectNavigation = true, и что в режиме коллизий игрока или коллизий видимости видны тела коллизий в целевом месте; - Достаточен ли диапазон загрузки коллизий: если целевое место выходит за диапазон загрузки, увеличьте
Max Load Collision Distance(m)и дождитесь повторной готовности коллизий; - Покрывает ли NavMeshBoundsVolume целевое место: переместите или отмасштабируйте Volume, чтобы границы построения навигации полностью покрывали целевую область;
- Была ли Static NavMesh перестроена: после проверки коллизий и диапазонов выполните Build → Build Paths, дождитесь завершения и сохраните уровень и данные навигации;
- Снова нажмите P и проверьте зелёное покрытие.
Если всё перечисленное верно, но создать навигацию по-прежнему не удаётся, дополнительно проверьте в Output Log ошибки, связанные с Navigation, Recast и коллизиями, и убедитесь, что текущий уровень сохранён.