Files
TheDeclineOfWarriors/docs/tasks/items/TASK-0023.md
T
2026-04-08 02:39:17 +03:00

102 lines
5.0 KiB
Markdown

---
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.
## 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.