AStar3D
Поиск пути по собственному графу 3D-точек с направленными связями и весами входа.
Создайте граф, добавьте точки через AddPoint, соедините их ConnectPoints и запросите GetIdPath или GetPointPath. Это данные маршрута: движок не строит коллизии, не перемещает персонажа и не обновляет граф вслед за Entity автоматически. Собственный экземпляр освобождайте через Dispose.
ArePointsConnected по умолчанию допускает связь в любом направлении; для направления используйте false. Частичный путь может не достичь цели: проверяйте последний ID. Отключённая начальная точка не даёт пути даже с partial.
Стоимость перехода равна _ComputeCost(fromId, toId) × weightScale назначения. Для оптимального поиска нужна допустимая согласованная эвристика. При произвольных неотрицательных стоимостях override _EstimateCost с return 0 — понятная исходная стратегия. Нативные defaults — евклидово расстояние; C# base-вызовы виртуальных методов не являются способом получить эту формулу.
Проверены небольшие графы, направление связей, веса, disabled, partial, closest-запросы и C# callbacks в Windows headless. Большие графы, параллельный поиск, физическая проходимость и другие платформы не проверялись.
Vector3 хранит три координаты: высота и глубина участвуют в default-расстоянии, closest-запросах и позициях пути. Держите точки в одной системе координат; локальные координаты разных Entity3D не преобразуются автоматически. Проверены отдельный вертикальный маршрут и проекция на 3D-сегмент.
Объявления сверены с C# SDK 1.0.0. Раскройте имя, чтобы увидеть сигнатуры и описание.
Конструкторы1
AStar3DКонструктор
public AStar3D();Создаёт пустой собственный граф, не Entity уровня и не навигационную сетку. Добавьте точки и связи вручную. Dispose экземпляр, когда он больше не нужен.
Свойства1
NeighborFilterEnabledСвойство
public bool NeighborFilterEnabled { get; set; }Включает вызовы _FilterNeighbor при обходе соседей; по умолчанию false. Возврат true из override запрещает конкретный переход. Не меняет GetPointConnections, ArePointsConnected или геометрические closest-запросы.
Методы30
AddPointvoid
public void AddPoint(long id, Vector3 position, float weightScale = 1f);Добавляет точку с неотрицательным ID и конечной позицией. weightScale — конечный неотрицательный множитель стоимости входа в эту точку, по умолчанию 1. Повторный ID обновляет позицию/вес, сохраняя связи и disabled-состояние. Сам по себе вызов не создаёт рёбер. Неверные ID/отрицательные веса дают нативную диагностику; NaN/Infinity проверяйте до вызова.
| Имя | Тип | По умолчанию |
|---|---|---|
id | long | — |
position | Vector3 | — |
weightScale | float | 1f |
idСуществующий неотрицательный ID; для AddPoint допускается новый ID. Не индекс массива.
positionКонечная позиция в выбранной вами системе координат графа.
weightScaleКонечный множитель стоимости входа ≥0. При весах <1 проверьте эвристику.
ArePointsConnectedbool
public bool ArePointsConnected(long id, long toId, bool bidirectional = true);Проверяет наличие прямой связи, а не маршрута. Важно: bidirectional=true допускает ребро в ЛЮБОМ направлении, не требует пары рёбер. false проверяет только id→toId. Для проверки двусторонней проходимости вызовите метод с false в обоих направлениях. Disabled и neighbor filter эту проверку не меняют.
| Имя | Тип | По умолчанию |
|---|---|---|
id | long | — |
toId | long | — |
bidirectional | bool | true |
idСуществующий неотрицательный ID; для AddPoint допускается новый ID. Не индекс массива.
toIdID другой существующей точки; у path-метода — цели, которая может быть недостижима.
bidirectionalУ ArePointsConnected true принимает любое направление; у ConnectPoints/DisconnectPoints true действует на оба. false везде означает id→toId.
boolНаличие прямого ребра по выбранному правилу направления, не достижимость пути.
Clearvoid
public void Clear();Удаляет все точки и связи и сбрасывает кандидат свободного ID в 0. Существующие C# массивы результатов остаются снимками. Не обещает освобождение всей зарезервированной памяти.
ConnectPointsvoid
public void ConnectPoints(long id, long toId, bool bidirectional = true);Соединяет две существующие разные точки: по умолчанию в обе стороны; false создаёт только id→toId. Повторная связь не добавляет дубликат соседа. Не проверяет коллизии/проходимость геометрии и не перемещает персонажа.
| Имя | Тип | По умолчанию |
|---|---|---|
id | long | — |
toId | long | — |
bidirectional | bool | true |
idСуществующий неотрицательный ID; для AddPoint допускается новый ID. Не индекс массива.
toIdID другой существующей точки; у path-метода — цели, которая может быть недостижима.
bidirectionalУ ArePointsConnected true принимает любое направление; у ConnectPoints/DisconnectPoints true действует на оба. false везде означает id→toId.
DisconnectPointsvoid
public void DisconnectPoints(long id, long toId, bool bidirectional = true);Удаляет связь между существующими точками. true удаляет оба направления; false — только id→toId, сохраняя обратное, если оно было. Точки остаются. Отсутствующее ребро не создаётся.
| Имя | Тип | По умолчанию |
|---|---|---|
id | long | — |
toId | long | — |
bidirectional | bool | true |
idСуществующий неотрицательный ID; для AddPoint допускается новый ID. Не индекс массива.
toIdID другой существующей точки; у path-метода — цели, которая может быть недостижима.
bidirectionalУ ArePointsConnected true принимает любое направление; у ConnectPoints/DisconnectPoints true действует на оба. false везде означает id→toId.
GetAvailablePointIdlong
public long GetAvailablePointId();Возвращает текущий свободный неотрицательный кандидат. Не резервирует ID: повторные запросы без AddPoint могут вернуть одно значение. После удаления кандидат может быть переиспользован; это не глобальный UUID и не обещание всегда наименьшего ID.
longСвободный кандидат ID без резервирования.
GetClosestPointlong
public long GetClosestPoint(Vector3 toPosition, bool includeDisabled = false);Ищет ближайшую точку по геометрическому расстоянию; при равенстве выбирает меньший ID. По умолчанию исключает disabled. Не проверяет маршрут, связи или neighbor filter. В исходниках начальный порог квадрата расстояния 1e20: экстремальные координаты требуют отдельной проверки.
| Имя | Тип | По умолчанию |
|---|---|---|
toPosition | Vector3 | — |
includeDisabled | bool | false |
toPositionКонечная позиция геометрического запроса в той же системе, что позиции точек.
includeDisabledtrue включает disabled-кандидатов в closest-point query; по умолчанию false.
longID геометрически ближайшего допустимого кандидата либо −1, если кандидат не найден.
GetClosestPositionInSegmentVector3
public Vector3 GetClosestPositionInSegment(Vector3 toPosition);Проецирует позицию на ближайший существующий сегмент с двумя enabled-концами. Геометрический запрос: направление ребра и neighbor filter не определяют проекцию. Если подходящего сегмента нет, возвращает Vector3.Zero — это также допустимая позиция, а не надёжный маркер ошибки. При равных расстояниях не полагайтесь на порядок сегментов.
| Имя | Тип | По умолчанию |
|---|---|---|
toPosition | Vector3 | — |
toPositionКонечная позиция геометрического запроса в той же системе, что позиции точек.
Vector3Позиция проекции; Vector3.Zero также используется, если сегмент не найден.
GetIdPath2 перегрузки
public long[] GetIdPath(long fromId, long toId);Возвращает ID пути от fromId к toId включительно. Оба ID должны существовать. Без достижимого пути — пустой массив; enabled fromId==toId даёт один ID, disabled start — пустой результат даже с partial. allowPartialPath=true допускает путь к лучшему достигнутому кандидату по эвристике, затем стоимости; его конец может отличаться от toId. Disabled goal не посещается. Проверяйте последний ID перед объявлением цели достигнутой. Не запускайте одновременные запросы/изменения на одном экземпляре.
| Имя | Тип | По умолчанию |
|---|---|---|
fromId | long | — |
toId | long | — |
fromIdСуществующий ID начала пути или исходной точки callback.
toIdID другой существующей точки; у path-метода — цели, которая может быть недостижима.
long[]Новый long[] с ID от начала к концу; пустой при отсутствии результата, partial-конец может быть не целью.
public long[] GetIdPath(long fromId, long toId, bool allowPartialPath = false);Возвращает ID пути от fromId к toId включительно. Оба ID должны существовать. Без достижимого пути — пустой массив; enabled fromId==toId даёт один ID, disabled start — пустой результат даже с partial. allowPartialPath=true допускает путь к лучшему достигнутому кандидату по эвристике, затем стоимости; его конец может отличаться от toId. Disabled goal не посещается. Проверяйте последний ID перед объявлением цели достигнутой. Не запускайте одновременные запросы/изменения на одном экземпляре.
| Имя | Тип | По умолчанию |
|---|---|---|
fromId | long | — |
toId | long | — |
allowPartialPath | bool | false |
fromIdСуществующий ID начала пути или исходной точки callback.
toIdID другой существующей точки; у path-метода — цели, которая может быть недостижима.
allowPartialPathtrue разрешает завершить путь на достигнутом кандидате, когда цель недоступна. Не гарантирует достижение toId и не разрешает disabled start.
long[]Новый long[] с ID от начала к концу; пустой при отсутствии результата, partial-конец может быть не целью.
GetPointCapacitylong
public long GetPointCapacity();Возвращает ёмкость внутреннего хранилища точек, не количество созданных точек и не предельную длину пути. Для количества используйте GetPointCount.
longТекущая ёмкость внутреннего хранилища, не count.
GetPointConnectionslong[]
public long[] GetPointConnections(long id);Возвращает ID исходящих соседей существующей точки. Для односторонней связи список у другого конца может быть пуст. Включает disabled/отфильтрованных соседей: это структура графа, не список доступных переходов текущего поиска. Порядок не считайте сортировкой.
| Имя | Тип | По умолчанию |
|---|---|---|
id | long | — |
idСуществующий неотрицательный ID; для AddPoint допускается новый ID. Не индекс массива.
long[]Новый long[] исходящих ID без обещания сортировки.
GetPointCountlong
public long GetPointCount();Возвращает число существующих точек, включая disabled. Это не число связей и не capacity.
longЧисло существующих точек, включая disabled.
GetPointIdslong[]
public long[] GetPointIds();Возвращает снимок всех ID, включая disabled. ID могут быть разреженными и больше int.MaxValue; не используйте ID как индекс массива точек без собственной таблицы. Порядок не гарантирован как сортировка.
long[]Новый long[] всех ID без обещания сортировки.
GetPointPath2 перегрузки
public Vector3[] GetPointPath(long fromId, long toId);Возвращает позиции точек найденного пути в системе координат, которую вы задали при AddPoint. Правила полного/частичного пути те же, что у GetIdPath; результат не является сглаженной траекторией или гарантией отсутствия столкновений. Для проверки достижения partial-цели используйте ID-путь. Собственный C# массив можно изменять без изменения графа. Не запускайте запросы параллельно на одном экземпляре.
| Имя | Тип | По умолчанию |
|---|---|---|
fromId | long | — |
toId | long | — |
fromIdСуществующий ID начала пути или исходной точки callback.
toIdID другой существующей точки; у path-метода — цели, которая может быть недостижима.
Vector3[]Новый Vector3[] позиций от начала к концу; пустой при отсутствии результата.
public Vector3[] GetPointPath(long fromId, long toId, bool allowPartialPath = false);Возвращает позиции точек найденного пути в системе координат, которую вы задали при AddPoint. Правила полного/частичного пути те же, что у GetIdPath; результат не является сглаженной траекторией или гарантией отсутствия столкновений. Для проверки достижения partial-цели используйте ID-путь. Собственный C# массив можно изменять без изменения графа. Не запускайте запросы параллельно на одном экземпляре.
| Имя | Тип | По умолчанию |
|---|---|---|
fromId | long | — |
toId | long | — |
allowPartialPath | bool | false |
fromIdСуществующий ID начала пути или исходной точки callback.
toIdID другой существующей точки; у path-метода — цели, которая может быть недостижима.
allowPartialPathtrue разрешает завершить путь на достигнутом кандидате, когда цель недоступна. Не гарантирует достижение toId и не разрешает disabled start.
Vector3[]Новый Vector3[] позиций от начала к концу; пустой при отсутствии результата.
GetPointPositionVector3
public Vector3 GetPointPosition(long id);Читает сохранённую позицию существующего ID. Позиции графа не синхронизируются автоматически с Entity3D. Отсутствующий ID даёт диагностику и нулевой fallback, поэтому сначала проверяйте HasPoint.
| Имя | Тип | По умолчанию |
|---|---|---|
id | long | — |
idСуществующий неотрицательный ID; для AddPoint допускается новый ID. Не индекс массива.
Vector3Сохранённая Vector3; нулевой fallback с диагностикой при неверном ID.
GetPointWeightScalefloat
public float GetPointWeightScale(long id);Читает множитель стоимости входа в существующую точку. Это не стоимость конкретного ребра и не эвристика. При неверном ID нулевой fallback с диагностикой нельзя считать допустимым весом.
| Имя | Тип | По умолчанию |
|---|---|---|
id | long | — |
idСуществующий неотрицательный ID; для AddPoint допускается новый ID. Не индекс массива.
floatМножитель входа; нулевой fallback с диагностикой при неверном ID.
HasPointbool
public bool HasPoint(long id);Проверяет существование ID независимо от disabled-состояния и наличия связей. Используйте до запросов, которым нужна существующая точка.
| Имя | Тип | По умолчанию |
|---|---|---|
id | long | — |
idСуществующий неотрицательный ID; для AddPoint допускается новый ID. Не индекс массива.
booltrue, если ID существует, даже когда точка disabled.
IsNeighborFilterEnabledbool
public bool IsNeighborFilterEnabled();Читает флаг вызова _FilterNeighbor во время поиска. Сам флаг не гарантирует наличие override и не меняет сохранённые рёбра.
boolТекущее значение NeighborFilterEnabled.
IsPointDisabledbool
public bool IsPointDisabled(long id);Читает disabled-состояние существующей точки. Disabled start не начинает поиск; disabled сосед пропускается. Это не проверка существования ID.
| Имя | Тип | По умолчанию |
|---|---|---|
id | long | — |
idСуществующий неотрицательный ID; для AddPoint допускается новый ID. Не индекс массива.
boolDisabled-флаг существующей точки; неверный ID не является обычным результатом.
RemovePointvoid
public void RemovePoint(long id);Удаляет существующий ID вместе с входящими и исходящими связями. Disabled вместо этого сохраняет структуру. Удалённый ID может стать следующим кандидатом GetAvailablePointId.
| Имя | Тип | По умолчанию |
|---|---|---|
id | long | — |
idСуществующий неотрицательный ID; для AddPoint допускается новый ID. Не индекс массива.
ReserveSpacevoid
public void ReserveSpace(long numNodes);Резервирует место под положительное число точек, не создавая их. Это настройка аллокаций, не генерация сетки и не ограничение максимального ID. Нулевое/отрицательное значение даёт диагностику; не используйте как команду сжатия.
| Имя | Тип | По умолчанию |
|---|---|---|
numNodes | long | — |
numNodesПоложительная желаемая ёмкость числа точек; не число создаваемых Entity.
SetNeighborFilterEnabledvoid
public void SetNeighborFilterEnabled(bool enabled);Устанавливает тот же флаг, что NeighborFilterEnabled. Включите его, чтобы _FilterNeighbor действительно вызывался; одного override недостаточно.
| Имя | Тип | По умолчанию |
|---|---|---|
enabled | bool | — |
enabledВключает/выключает вызовы фильтра при поиске, не включает сами точки.
SetPointDisabledvoid
public void SetPointDisabled(long id, bool disabled = true);По умолчанию отключает существующую точку, false включает обратно. Точка и связи сохраняются. Disabled нельзя использовать как удаление ID или проверку существования.
| Имя | Тип | По умолчанию |
|---|---|---|
id | long | — |
disabled | bool | true |
idСуществующий неотрицательный ID; для AddPoint допускается новый ID. Не индекс массива.
disabledtrue отключает точку, false возвращает её в поиск.
SetPointPositionvoid
public void SetPointPosition(long id, Vector3 position);Меняет позицию существующей точки для последующих запросов и default-стоимостей. Рёбра сохраняются; предыдущие массивы путей не обновляются. Передавайте конечные координаты в одной согласованной системе.
| Имя | Тип | По умолчанию |
|---|---|---|
id | long | — |
position | Vector3 | — |
idСуществующий неотрицательный ID; для AddPoint допускается новый ID. Не индекс массива.
positionКонечная позиция в выбранной вами системе координат графа.
SetPointWeightScalevoid
public void SetPointWeightScale(long id, float weightScale);Меняет конечный неотрицательный множитель стоимости входа. Он умножает _ComputeCost даже у C# override; начальная точка не получает отдельную плату входа. Значения ниже 1 могут сделать стандартную евклидову эвристику завышенной: для надёжного поиска настройте допустимую согласованную эвристику, например 0 при неотрицательных стоимостях.
| Имя | Тип | По умолчанию |
|---|---|---|
id | long | — |
weightScale | float | — |
idСуществующий неотрицательный ID; для AddPoint допускается новый ID. Не индекс массива.
weightScaleКонечный множитель стоимости входа ≥0. При весах <1 проверьте эвристику.
_ComputeCostfloat
public virtual float _ComputeCost(long fromId, long toId);Переопределяемая базовая стоимость направленного перехода между соединёнными точками. Движок дополнительно умножает её на weightScale назначения. Нативное поведение без override — евклидово расстояние. В C# base._ComputeCost возвращает default(float), а не вызывает нативную формулу: для расстояния вычислите GetPointPosition(fromId).DistanceTo(GetPointPosition(toId)) явно. Возвращайте конечную неотрицательную стоимость.
| Имя | Тип | По умолчанию |
|---|---|---|
fromId | long | — |
toId | long | — |
fromIdСуществующий ID начала пути или исходной точки callback.
toIdID другой существующей точки; у path-метода — цели, которая может быть недостижима.
floatКонечная неотрицательная базовая стоимость; движок ещё применит вес назначения.
_EstimateCostfloat
public virtual float _EstimateCost(long fromId, long endId);Переопределяемая эвристика оставшейся стоимости, не списываемая стоимость перехода. Без override нативный поиск использует евклидово расстояние. Для оптимального пути нужна допустимая и согласованная оценка; закрытые точки не переоткрываются. При неотрицательных стоимостях return 0 убирает завышение, но может расширить поиск. C# base._EstimateCost сам возвращает default(float), не нативное расстояние.
| Имя | Тип | По умолчанию |
|---|---|---|
fromId | long | — |
endId | long | — |
fromIdСуществующий ID начала пути или исходной точки callback.
endIdСуществующий ID цели, до которой оценивается оставшаяся стоимость.
floatКонечная согласованная нижняя оценка оставшейся стоимости.
_FilterNeighborbool
public virtual bool _FilterNeighbor(long fromId, long neighborId);Переопределите для запрета перехода fromId→neighborId: true пропускает соседа, false допускает обычную проверку. Вызывается только при NeighborFilterEnabled=true. Не изменяйте граф из callback и не путайте true с разрешением перехода. Это фильтр поиска, не физическая проверка коллизии.
| Имя | Тип | По умолчанию |
|---|---|---|
fromId | long | — |
neighborId | long | — |
fromIdСуществующий ID начала пути или исходной точки callback.
neighborIdСуществующий ID рассматриваемого исходящего соседа.
booltrue запрещает этот переход; false не отфильтровывает его.