tags: [vr-ar]
Настройка навігаційних сіток для VR локацій
NavMesh для VR-локацій — не те ж саме, що NavMesh для звичайної гри. У VR простір сприймається інакше: NPC або враг, який проходить надто близько до гравця, викликає фізичний дискомфорт. NavMesh має це враховувати — включаючи настройку радіусів агентів та масок проходимості.
Крім того, VR-локації часто мають складну вертикальну геометрію: сходи, платформи, поручні, нерівний підлогу. Стандартний NavMesh Bake з Unity Window → AI → Navigation тут дає некоректні результати без додаткової настройки.
NavMeshSurface vs Legacy NavMesh
Компонент NavMeshSurface з пакету AI Navigation (com.unity.ai.navigation) замінює застарілий вбудований NavMesh Bake. Ключові відмінності для VR:
NavMeshSurface можна запікувати в рантаймі — це необхідно для процедурно-генерованих VR-локацій. У legacy режимі NavMesh статичний. Для VR-ігор з розруйною геометрією (розбиті ящики, упалі стіни) або пересчитуємо NavMesh локально через UpdateNavMeshData з обмеженою NavMeshBuildSettings.Bounds, або використовуємо NavMeshObstacle для тимчасового блокування зон.
Agent Type — критична настройка. Для VR створюємо мінімум два типи агентів: Enemy_Standard з радіусом 0.35 м (щільна навігація) та Enemy_Large з радіусом 0.6 м (боси, крупні істоти). Якщо використовувати один тип для всіх, крупні істоти будуть «влізати» в вузькі коридори, що виглядає нереалістично.
Step Height — максимальна висота ступені, яку агент преодолює без NavMeshLink. Для VR-локацій з реалістичною архітектурою: 0.25 м — це одна стандартна ступень сходів. Якщо ступені вище — потрібні NavMeshLink компоненти.
Сходи та вертикальні переходи у VR
Сходи в NavMesh — постійна головна біль. За умовчанням NavMesh bake не обробляє сходи коректно: або не покриває їх (надто крутий нахил), або створює NavMesh прямо по геометрії ступенів — із зубчастим профілем, по якому агенти рухаються стрибками.
Правильне рішення для VR: для кожних сходів створюємо NavMeshLink з точкою старту внизу та точкою фінішу вверху. Агент телепортується між ними миттєво, а анімація підйому по сходах програє як окремий стан в Animator. Це значно чистіше, ніж спроби змусити NavMeshAgent фізично підніматися по ступеням.
Для відкритих балконів та платформ: два окремі NavMeshSurface (нижній рівень + верхній), з'єднані NavMeshLink на сходах та ліфтах. NavMeshLink має бути двостороннім (Bidirectional = true), якщо агент може йти в обидві сторони.
Off Mesh Link (застарілий варіант) та NavMeshLink (новий) відрізняються: Off Mesh Link вимагає ручного вказання двох точок на сцені, NavMeshLink — компонент з Area Mask та шириною лінка. Для VR краще NavMeshLink — він коректніше обробляє багатокористувацькі перетини.
Area Masks та зони проходимості
NavMesh Area дозволяє розмітити поверхні за типами: Walkable, Not Walkable, Jump. Для VR додаємо кастомні: Dangerous (зона вогню, прірва — агент проходить тільки якщо немає іншого шляху), PlayerPersonalSpace (3-метрова зона навколо спавну гравця — враги не заходять туди без агресивного триггеру).
PlayerPersonalSpace реалізується через NavMeshModifierVolume з типом Not Walkable, прикріплений до об'єкту гравця з offset. При приближенні врага триггер знімається, область пересчитується через NavMesh.AddNavMeshData для локального патчу. Грубо, але дає ефект «враг не ломиться напрямку в обличчя».
Динамічні перешкоди: NavMeshObstacle
NavMeshObstacle — компонент для динамічних об'єктів, які блокують шляхи агентів. Два режими: Carve = false (об'єкт просто розталкує агентів як фізичне тіло) та Carve = true (об'єкт вирізає дірку в NavMesh).
Carve = true пересчитує NavMesh у реальному часі — дорогостояща операція. Для VR з розруйним окремженням не можна вішати Carve на кожний ящик: при одночасному руйнуванні 10 об'єктів кожний ініціює пересчет NavMesh. Правильний підхід: Carve = false для об'єктів, які зникають (вони й так уходять з шляху), Carve = true тільки для об'єктів, які утворюють постійні перешкоди (упала стіна, обвалений підлогу).
NavMeshObstacle.carveOnlyStationary = true — оптимізація: вирізання відбувається тільки коли об'єкт зупинився. Рухомі об'єкти (катяча бочка) не викликають безперервний пересчет.
Строки та процес
Робота починається з аудиту геометрії локації: статична/динамічна, складність вертикального простору, число агентів. Потім настройка Agent Types, Area Masks, запікування базового NavMesh. Далі — тестування на всіх переходах (сходи, платформи) та настройка NavMeshLink. Нарешті — тест з кількома агентами одночасно на стресових сценаріях.
| Масштаб локації | Орієнтовні строки |
|---|---|
| Одна кімната / невелика арена | 2–4 дні |
| Багаторівнева локація (2–4 поверхи) | 1–2 тижні |
| Відкритий світ / процедурна генерація | 3–8 тижнів |
Вартість розраховується після аналізу геометрії локацій та вимог до навігаційної поведінки агентів.





