reckfellENGINE

Запекание навигации 2D и 3D

Получить полигоны из исходной геометрии и проверить путь.

На этой странице

Запекание преобразует выбранную исходную геометрию в проходимые полигоны: NavigationPolygon в 2D, NavigationMesh в 3D. Поиск пути использует полученную навигацию, а не автоматически все видимые модели и коллайдеры уровня.

Три отдельных этапа

  1. Подготовьте исходную геометрию: разберите нужные Entity или заполните source-data ресурс программно.
  2. Выполните запекание и проверьте, что результат содержит полигоны.
  3. Назначьте результат региону нужной карты, дождитесь публикации и проверьте путь.

Успешная компиляция скрипта не подтверждает ни второй, ни третий этап. Пустой ресурс NavigationMesh также не является готовым маршрутом.

Выполненный пример 2D и 3D

Сохраните NavigationBakeSamples.cs в C#-проекте Reckfell 1.0.0:

C#
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, уменьшение границы и запросы по обоим результатам. Разбор реального уровня, препятствия/низкие потолки, физическое тело, редактор, асинхронность, экспорт и производительность не проверены этим набором.

Документация Reckfell EngineНаверх ↑
БЫСТРЫЙ ПЕРЕХОДНачало работыEntity и иерархияC# & .NET 10Сцены и префабы
Руководства и полный API Reckfell K
reckfellENGINE
RECKFELL ACCOUNT

Вход в аккаунт

Войдите в аккаунт Reckfell.

Один аккаунт для всей платформы Reckfell.