Объявление
public Experimental.AI.PathQueryStatus GetEdgesAndNeighbors(Experimental.AI.PolygonId node, NativeSliceПараметры
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();
}
}