Прямой путь 2D и 3D: запрос и проверка
Получить точки и отличить полный маршрут от спроецированного.
NavigationServer2D.MapGetPath возвращает Vector2[], NavigationServer3D.MapGetPath — Vector3[]. Для прямого запроса не нужен отдельный NavigationAgent, но нужна живая карта с опубликованной навигационной геометрией.
Получить точки
Передайте RID нужной карты, старт и цель в глобальных координатах карты, режим обработки и маску слоёв. В существующем регионе карту можно получить через GetNavigationMap(). Для стандартного мира — GetWorld2D().NavigationMap или GetWorld3D().NavigationMap внутри подходящей Entity в дереве.
Сохраните SimplePaths.cs в C#-проекте Reckfell 1.0.0:
using Reckfell;
using System;
public static class SimplePaths
{
public static Vector2[] Find2D(Rid map, Vector2 start, Vector2 target,
uint layers = 1, bool optimize = true)
{
if (!map.IsValid || layers == 0 || NavigationServer2D.MapGetIterationId(map) == 0)
return Array.Empty<Vector2>();
return NavigationServer2D.MapGetPath(map, start, target, optimize, layers);
}
public static Vector3[] Find3D(Rid map, Vector3 start, Vector3 target,
uint layers = 1, bool optimize = true)
{
if (!map.IsValid || layers == 0 || NavigationServer3D.MapGetIterationId(map) == 0)
return Array.Empty<Vector3>();
return NavigationServer3D.MapGetPath(map, start, target, optimize, layers);
}
}Вызывайте Find2D или Find3D с RID своей размерности. Помощник возвращает пустой массив для нулевого RID, маски 0 или ещё не опубликованной карты. Он не определяет, был ли ненулевой RID уже освобождён: временем жизни карты должен управлять вызывающий код.
Для проверенной поверхности x=0–10 путь от (1, 5) до (9, 5) заканчивается у (9, 5). После добавления соприкасающегося региона x=10–20 на ту же карту доступна цель (19, 5). На другой карте тот же регион не участвует в поиске.
Проверить результат
- Если массив пуст, не читайте
path[0]. Проверьте геометрию, карту, маску и синхронизацию. - Сравните первую точку со стартом: старт за пределами разрешённой поверхности может быть спроецирован.
- Сравните последнюю точку с целью с допуском вашей игры. При недостижимой цели возвращается частичный маршрут, а не обязательно пустой массив.
- Если принимаете частичный путь, сделайте это явным решением игровой логики. Не объявляйте цель достигнутой только по наличию точек.
Готовый вариант проверки обоих концов есть в объектах запроса пути. Навигационная связь может содержать переход через пустоту: путь не обещает непрерывный физический пол под всеми его точками. Для таких участков нужна логика перехода.
Что меняет optimize
true соответствует обработке Corridorfunnel: путь сокращается внутри найденного коридора полигонов. false соответствует Edgecentered: промежуточные точки располагаются в центрах пересекаемых рёбер. Это не выключение поиска A* и не обещание более быстрого запроса. Оба соответствия проверены сравнением с QueryPath на одной карте.
Для метаданных, фильтров регионов, обрезки и многократного использования объектов параметров выбирайте QueryPath. Не выполняйте новый поиск каждый кадр без необходимости: решайте, когда изменились цель, карта или условия маршрута, и измеряйте нагрузку своей игры.
Как использовать путь для движения
Храните текущий индекс точки. Перейдите к следующей, когда персонаж подошёл к ней с допустимой погрешностью; завершите маршрут после последней точки. Для физического персонажа применяйте соответствующий API движения тела, а не прямую подмену позиции: первый персонаж 3D.
Массив пути сам не обновляется при изменении карты, не двигает Entity и не выполняет избегание. Новый маршрут запрашивается отдельно. Игра также должна обработать застревание и недостижимую цель.
Проверены точные помощники 2D/3D, полный и спроецированный результат, изоляция карт, нулевая маска и соответствие режимов обработки 2D. Физическое следование пути, сложные меши, производительность и качество оптимизации не проверены этим набором.