Приседание: высота и выбор маршрута
Выбрать готовую карту нужной высоты и не забыть физическое тело.
Если персонаж меняет высоту при приседании, планирование должно соответствовать выбранному состоянию. Нельзя найти путь низкого персонажа, а затем пройти его стоящим телом без проверки пространства.
Подготовить два варианта
В примере разных размеров метод ClearanceBakes.BakeLowCeiling3D(height) создаёт одинаковый пол и потолок на высоте 1,5 над средним участком. Запеките вариант с height = 2 для стоящего персонажа и height = 1 для присевшего. Для каждого результата создайте собственную карту/регион, согласуйте CellSize/CellHeight и дождитесь публикации.
В выполненной проверке цель за потолком недостижима по стоящей карте и достижима по карте приседания. Повторный запрос стоящей карты остаётся заблокированным: один запрос другой карты её не изменяет.
Выбрать маршрут по состоянию
Сохраните StanceRoutes3D.cs:
using Reckfell;
using System;
public static class StanceRoutes3D
{
public static Vector3[] Find(Rid standingMap, Rid crouchedMap,
bool crouched, Vector3 start, Vector3 target)
{
Rid map = crouched ? crouchedMap : standingMap;
if (!map.IsValid || NavigationServer3D.MapGetIterationId(map) == 0)
return Array.Empty<Vector3>();
return NavigationServer3D.MapGetPath(map, start, target, true);
}
}Передайте обе живые карты, текущее состояние и глобальные координаты. Помощник выбирает карту только для запроса. Он не меняет высоту тела, анимацию, карту NavigationAgent или расчёт избегания. Проверяйте точки результата: стоящая карта может вернуть частичный путь, а не пустой массив.
В проверке использованы старт (5, 0,25, 5) и цель (25, 0,25, 5). Вертикальная координата отражает дискретизацию построенной поверхности; это не универсальная высота для любого уровня.
Переход между состояниями
- Прежде чем встать, проверьте реальное свободное место для новой физической формы.
- Примените разрешённое игровое состояние и соответствующий коллайдер/анимацию.
- Выберите навигацию этого состояния и запросите маршрут снова. Старый массив пути не проверяет новый размер тела.
- Если используете NavigationAgent, согласуйте его карту, цель и текущее движение; после смены дождитесь серверного обновления.
- Если полного пути нет, оставьте персонажа в допустимом состоянии, остановитесь или выберите другую цель по правилам игры.
Не меняйте только NavigationMesh.AgentHeight после запекания: само присваивание не строит другой меш. Нужен готовый вариант или новое запекание с публикацией.
Не потерять взаимное избегание
NavigationAgent2D.SetNavigationMap назначает и карту запросов Entity, и серверную карту её агента. Это не переключатель только геометрии. Избегание рассчитывается в пределах карты; разделение персонажей по картам может лишить их ожидаемого взаимного учёта.
Не переносите агент в другую карту только ради анимационного состояния, если ожидаете общее избегание со всеми персонажами. Разделите выбор маршрута и архитектуру расчёта избегания явно. Представленный помощник делает только первое; общая симуляция избегания между вариантами не реализована в нём.
Проверены точный выбор карты и запекание высот 1/2 под потолком 1,5 в 3D, а смена карты Entity/сервера — отдельно в 2D. Изменение физической формы, тест свободного места, анимация и взаимное избегание между вариантами не проверены выполнением.