Мои Уведомления
Привет, !
Мой Аккаунт Мои Финансы Мои Подписки Мои Настройки Выход
Руководство API скрипты

NavMeshQuery.GetEdgesAndNeighbors

Экспериментальный: этот API является экспериментальным и может быть изменен или удален в будущем.

Объявление

public Experimental.AI.PathQueryStatus GetEdgesAndNeighbors(Experimental.AI.PolygonId node, NativeSlice edgeVertices, NativeSlice neighbors, NativeSlice edgeIndices, out int verticesCount, out int neighborsCount);

Параметры

node Идентификатор узла из поверхности NavMesh, NavMeshLink или Ссылка вне сетки, для которого нужно получить вершины и соседей.
edgeVertices Буфер результатов, содержащий мировые позиции, описывающие геометрию входного навигационного node. Он может иметь нулевую пропускную способность.
Многоугольные узлы NavMesh имеют минимум 3 и максимум 6 вершин.
OffMeshConnection всегда представлены 4 вершинами, независимо от их ширины.
neighbors Буфер результатов, содержащий идентификаторы всех навигационных узлов, непосредственно доступных из заданного node. Он может иметь нулевую мощность.
edgeIndices Вспомогательный буфер результатов, который сопоставляет каждый соседний узел с краем заданного node. Он может иметь нулевую емкость.
Индекс элемента в edgeIndices также является индексом в массиве neighbours и значением этого edgeIndices является индексом в массиве edgeVertices.
verticesCount Общее количество вершин, описывающих геометрию входного узла. Это не зависит от емкости буфера результатов vertices.
neighborsCount Общее количество узлов навигации, к которым подключается входной node. Это не зависит от емкости буферов результатов (neighbours и edgeIndices).

Возвращает

PathQueryStatusУспешно, если Unity может оценить соседей и вершины указанного узла независимо от результата. В этом случае значения verticesCount и neighboursCount всегда допустимы.
Ошибка если Unity не может использовать идентификатор node для получения информации о соседях или геометрии. Unity не изменяет ни один из пяти параметров результата (edgeVertices, neighbours, edgeIndices, verticesCount или neighboursCount).
InvalidParam является частью возвращаемых флагов, если указанный навигационный узел не является действительным в NavMeshWorld запроса.
BufferTooSmall является частью флагов PathQueryStatus, которые Unity возвращает из этой функции, когда любой из буферов результатов, которые вы предоставляете, недостаточно велик для хранения всех соседних узлов входного node соединяется с граничными вершинами или со всеми их вершинами.

Описание

Получает вершины заданного node и идентификаторы всех узлов навигации, к которым он подключен. .

полигон поверхности NavMesh соединяется со всеми другими соседними полигонами, с которыми он имеет общее ребро, а также со всеми OffMeshLinks или NavMeshLinks, которые выходят из любого места на его поверхности. Полигон не соединяется с другими полигонами, с которыми он имеет общую вершину.
Каждая точка, возвращаемая в массиве edgeVertices, представляет собой начало ребра node, а следующий элемент массива является концом точка этого края. Все вершины образуют замкнутую ломаную. Последний и первый элементы определяют последнее ребро.

Ссылка вне сетки соединяется со всеми полигонами NavMesh, с которыми пересекается каждый конец ссылки, независимо от того, является ли ссылка однонаправленной.
Для узлов связи возвращаемый массив edgeVertices содержит две пары точек с индексами [0]-[1] и [2]-[3], которые определяют конечные точки начальной и конечные ребра ссылки, в этом порядке. Это мировые позиции, установленные в момент создания ссылки в мире NavMesh. Для узлов, добавленных через компоненты Off-mesh Link, пары содержат одно и то же значение в обоих своих элементах.

Узел из массива neighbours находится на ребре, возвращаемом в edgeIndices, по тому же индексу.
Если и данный node, и его сосед являются NavMesh полигонами, то соответствующий edgeIndices представляет собой индекс ребра многоугольника, ведущего от node к соседнему. Например. edgeVertices[edgeIndices[2]] представляет начальную точку ребра, общего между node и neighbours[2], а edgeVertices[edgeIndices[2] + 1] — это конечная точка этого ребра.
Полигон NavMesh может иметь максимум 6 ребер. Это означает, что значение edgeIndices, соответствующее соединению между полигонами, находится в диапазоне от 0 до 5 включительно. Ребро обычно соединяет только два полигона, которые его разделяют, но ребра, расположенные на границе тайла, могут соединять один полигон в первом тайле с несколькими полигонами во втором тайле. В этом случае edgeIndices сообщает одно и то же значение для всех этих соседей.
Если данный node или соседний является связью, то соответствующее значение edgeIndices представляет сторону ссылки, с которой выполняется подключение: 0 для start и 2 для end. Если node представляет собой многоугольник, а сосед — ссылку, значение действует только как информация о стороне ссылки, на которой два узла соединяются и не должны использоваться в качестве индекса в массиве edgeVertices.
Когда буферы neighbors и edgeIndices имеют положительную емкость, они должны быть одного размера, иначе вы столкнетесь с ArgumentException, когда этот метод выполняется в редакторе.

Вы можете настроить любой из буферов на нулевую емкость для случаев, когда вам не нужны результаты.

Возвращенные значения verticesCount и neighboursCount выражают количество элементов, составляющих результат в выходных буферах достаточного размера. Буферы, которые недостаточно велики, по-прежнему заполнены действительными узлами до их полной емкости.

Пять параметров результата (edgeVertices, neighbours, edgeIndices, verticesCount и neighboursCount) не используются в качестве входных данных и никоим образом не изменяют внутренние навигационные данные. Unity изменяет их только в том случае, если операция возвращает статус Success.

Смотрите так же: NavMeshQuery.GetPolygonType, NavMeshQuery.GetPortalPoints.

using Unity.Collections; using UnityEngine; using UnityEngine.Experimental.AI; public class NavMeshNodeEdgesDrawer : MonoBehaviour { void Update() { var query = new NavMeshQuery(NavMeshWorld.GetDefaultWorld(), Allocator.Temp); var vertices = new NativeArray<Vector3>(6, Allocator.Temp); var neighbors = new NativeArray<PolygonId>(10, Allocator.Temp); var edgeIndices = new NativeArray(neighbors.Length, Allocator.Temp); int totalVertices; int totalNeighbors; var location = query.MapLocation(transform.position, Vector3.one, 0); var queryStatus = query.GetEdgesAndNeighbors( location.polygon, vertices, neighbors, edgeIndices, out totalVertices, out totalNeighbors); var color = (queryStatus & PathQueryStatus.Success) != 0 ? Color.green : Color.red; Debug.DrawLine(transform.position - Vector3.up, transform.position + Vector3.up, color); for (int i = 0, j = totalVertices - 1; i < totalVertices; j = i++) { Debug.DrawLine(vertices[i], vertices[j], Color.grey); } for (var i = 0; i < totalNeighbors; i++) { if (query.GetPolygonType(neighbors[i]) == NavMeshPolyTypes.OffMeshConnection) { // The link neighbor is not connected through any of the polygon's edges. // Call GetEdgesAndNeighbors() on this specific neighbor in order to retrieve its edges. continue; } var start = edgeIndices[i]; var end = (start + 1) % totalVertices; var neighborColor = Color.Lerp(Color.yellow, Color.magenta, 1f * start / (totalVertices - 1)); Debug.DrawLine(vertices[start], vertices[end], neighborColor); } query.Dispose(); vertices.Dispose(); neighbors.Dispose(); edgeIndices.Dispose(); } }
Вы можете отблагодарить автора, за перевод документации на русский язык. ₽ Спасибо
API скрипты 2021.3