Запекание навигации 2D и 3D
Получить полигоны из исходной геометрии и проверить путь.
Запекание преобразует выбранную исходную геометрию в проходимые полигоны: NavigationPolygon в 2D, NavigationMesh в 3D. Поиск пути использует полученную навигацию, а не автоматически все видимые модели и коллайдеры уровня.
Три отдельных этапа
- Подготовьте исходную геометрию: разберите нужные Entity или заполните source-data ресурс программно.
- Выполните запекание и проверьте, что результат содержит полигоны.
- Назначьте результат региону нужной карты, дождитесь публикации и проверьте путь.
Успешная компиляция скрипта не подтверждает ни второй, ни третий этап. Пустой ресурс NavigationMesh также не является готовым маршрутом.
Выполненный пример 2D и 3D
Сохраните NavigationBakeSamples.cs в C#-проекте Reckfell 1.0.0:
using Reckfell;
using System;
public static class NavigationBakeSamples
{
public static NavigationPolygon BakeSquare2D()
{
using var source = new NavigationMeshSourceGeometryData2D();
source.AddTraversableOutline(new[]
{
new Vector2(0, 0), new Vector2(20, 0),
new Vector2(20, 20), new Vector2(0, 20)
});
var polygon = new NavigationPolygon { AgentRadius = 1, CellSize = 1 };
NavigationServer2D.BakeFromSourceGeometryData(polygon, source);
if (polygon.GetPolygonCount() > 0) return polygon;
polygon.Dispose();
throw new InvalidOperationException("2D bake produced no polygons.");
}
public static NavigationMesh BakeFloor3D()
{
using var source = new NavigationMeshSourceGeometryData3D();
source.AddFaces(new[]
{
new Vector3(-10, 0, -10), new Vector3(10, 0, 10), new Vector3(-10, 0, 10),
new Vector3(-10, 0, -10), new Vector3(10, 0, -10), new Vector3(10, 0, 10)
}, Transform3D.Identity);
var mesh = new NavigationMesh
{
AgentRadius = 0.5f, AgentHeight = 2,
CellSize = 0.25f, CellHeight = 0.25f
};
NavigationServer3D.BakeFromSourceGeometryData(mesh, source);
if (mesh.GetPolygonCount() > 0) return mesh;
mesh.Dispose();
throw new InvalidOperationException("3D bake produced no polygons.");
}
}BakeSquare2D() синхронно запекает квадрат 20×20 с радиусом агента 1. Проверка получила непустые полигоны внутри диапазона примерно 1–19 по обеим осям; после назначения региону построен путь от (2, 2) до (18, 18).
BakeFloor3D() синхронно запекает плоский пол из двух треугольников. В выполненной проверке результат содержит полигоны и используется сервером для пути между участками пола. Важен порядок вершин треугольников: неверная ориентация может оставить поверхность непроходимой. Не меняйте порядок в примере произвольно.
Возвращённым ресурсом владеет вызывающий код. Используйте его в регионе и освобождайте ссылку, когда она больше не нужна. Source-data ресурсы помощник освобождает сам. Пример не создаёт графическую модель, коллайдер или персонажа.
Какие параметры задают проходимость
| Параметр | Что учитывать |
|---|---|
AgentRadius | Зазор для центра персонажа у границ. Изменение радиуса NavigationAgent не перезапекает меш под другой размер тела. |
AgentHeight в 3D | Нужная высота свободного пространства при запекании. Не заменяет физическую форму персонажа. |
CellSize, CellHeight | Разрешение построения. Итоговая граница и высота поверхности могут сместиться из-за растеризации. |
После назначения 3D-ресурса согласуйте MapSetCellSize и MapSetCellHeight карты с ресурсом. В проверке использованы значения mesh.CellSize и mesh.CellHeight. Не требуйте точного совпадения высоты точки пути с исходным y=0: путь проецируется на построенную поверхность.
Слишком большой радиус может удалить узкие проходы. Слишком малый — дать путь, по которому физическое тело не помещается. Проверка количества полигонов не доказывает корректный зазор для реального персонажа.
Разбор уровня через NavigationRegion
Entity региона объединяет разбор исходных объектов, запекание и передачу результата. Выбор визуальной/физической геометрии, слоёв коллизии и групп задаётся параметрами ресурса. Если нужная стена не выбрана для разбора, запекание не узнает о ней.
Разбор EntityTree выполняйте в основном потоке. Для больших проектов можно отдельно подготовить данные и использовать асинхронное запекание, но завершение вызова не равнозначно готовому результату: дождитесь соответствующего завершения и обновления карты. Данный помощник использует только синхронный source-data API; действия в редакторе и асинхронный вариант здесь не проверены.
Если результат пуст или неверен
- Полигонов нет: проверьте выбранную геометрию, ориентацию треугольников, размеры, радиус и ограничения запекания.
- Полигоны есть, пути нет: проверьте регион, карту, слои и синхронизацию.
- Путь пересекает стену: проверьте, попала ли стена в исходные данные, и перезапеките ресурс.
- Между ресурсами нет прохода: проверьте соединение границ, а не только общий вид модели.
Проверены точный код, синхронное запекание 2D/3D, уменьшение границы и запросы по обоим результатам. Разбор реального уровня, препятствия/низкие потолки, физическое тело, редактор, асинхронность, экспорт и производительность не проверены этим набором.