Files
TheDeclineOfWarriors/docs/tasks/items/TASK-0023.md
T
Alexander Borisov 31826bd4e0 task update
2026-04-08 20:48:11 +03:00

105 lines
5.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
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.