--- id: TASK-0023 title: Runtime NavMesh bake для voxel-чанка summary: Реализовать генерацию/обновление NavMesh в рантайме для каждого voxel-чанка, чтобы враги могли корректно ходить по процедурному миру. priority: Highest area: ai owner: abysscion created: 2026-03-31 updated: 2026-04-08 execution_time: 2d depends_on: - TASK-0003 canonical_docs: - docs/tasks/Index.md - docs/architecture/mvp-world-authority-navmesh.md - docs/plans/TASK-0023-runtime-navmesh-implementation-plan.md related_files: - Assets/Features/VoxelWorld/Runtime/VoxelWorldGenerator.cs --- # TASK-0023 - Runtime NavMesh bake для voxel-чанка ## Status Статус задачи ведется в `docs/tasks/Index.md` и является каноническим там. ## Why AI врагов (`TASK-0012`) опирается на NavMesh. Воксельный мир генерируется чанками в рантайме, значит навигация должна обновляться динамически, иначе враги не смогут корректно находить путь. ## Expected Outcome - Для активных чанков есть актуальный NavMesh, соответствующий walkable поверхности. - При загрузке/обновлении чанка навигация перестраивается предсказуемо и без зависаний. - Есть понятные границы: когда перестраиваем NavMesh, когда откладываем, как ограничиваем стоимость. ## Current Context `VoxelWorldGenerator` строит mesh/collider для чанка. Это хорошая опора для NavMeshSource сборки, но нужно аккуратно сделать runtime bake на уровне чанка или группы чанков. ## Scope In - определить модель bake: per-chunk NavMeshData, либо один NavMeshData на область вокруг игрока - собрать NavMesh build sources из чанка (MeshCollider/BoxCollider/Renderer) - обновлять NavMesh при загрузке/выгрузке чанков - ограничения производительности: throttle, бюджет на кадр, батчирование ## Scope Out - полноценный crowd simulation - оптимизация под большие карты без ограничений ## Constraints - runtime bake не должен фризить игру - результат должен быть одинаков в рамках одного мира при одинаковых чанках ## Suggested Approach 1. Выбрать подход: `NavMeshSurface` (если используется пакет) или ручной `NavMeshBuilder.UpdateNavMeshDataAsync`. 2. Определить build bounds по чанку и собрать build sources по его коллайдерам. 3. Встроить вызов bake в lifecycle чанка: после генерации mesh/коллайдера. 4. Добавить throttling и очереди обновлений. ## Acceptance Criteria - после генерации чанка враг способен построить путь по поверхности чанка - при выгрузке чанка навигация не содержит "висячих" областей ## Verification - ручной тест: враг преследует игрока при перемещении между чанками - стресс тест: быстро двигаться по миру и убедиться, что обновления не фризят ## Risks / Open Questions - нужно определить, как синхронизировать bake с сетевой моделью (сервер/клиент) и где AI реально работает ## Human Decisions Needed - none currently ## Decision Log - `2026-03-31` - runtime bake вынесен в отдельную задачу как prerequisite для enemy NavMesh AI. - `2026-04-08` - runtime NavMesh sidecar реализован через contracts + DI + MessagePipe, а базовый local-build pipeline переведен на clustered coverage windows отдельной follow-up задачей. ## Handoff Notes Реализация задачи должна идти с учетом принятых решений и уже проведенного ресерча в `docs/architecture/mvp-world-authority-navmesh.md`, `docs/plans/TASK-0023-runtime-navmesh-implementation-plan.md` и текущего runtime-контекста `Assets/Features/VoxelWorld/Runtime/VoxelWorldGenerator.cs`. Если формулировки task-card расходятся с каноническими решениями и зафиксированным ресерчем, приоритет у этих файлов. Если в проекте нет пакета NavMeshComponents, возможно придется добавить его или реализовать минимальный runtime builder. Задача закрыта как базовый infrastructural milestone. Дальнейшие улучшения pathing, player navigation и coverage policy должны идти отдельными задачами, а не переоткрывать этот базовый runtime NavMesh foundation.