Experimental: this API is experimental and might be changed or removed in the future.

NavMeshQuery.GetEdgesAndNeighbors

切换到手册
public Experimental.AI.PathQueryStatus GetEdgesAndNeighbors (Experimental.AI.PolygonId node, NativeSlice<Vector3> edgeVertices, NativeSlice<PolygonId> neighbors, NativeSlice<byte> edgeIndices, out int verticesCount, out int neighborsCount);

参数

node来自 NavMesh 表面、NavMeshLink网格外链接的节点的标识符,需要对该节点获取顶点和邻居。
edgeVertices结果缓冲区,包含描述输入导航 node 的几何体的世界位置。它可以具有零容量。
NavMesh 的多边形节点具有最少 3 个,最多 6 个顶点。
OffMeshConnection 节点始终由 4 个顶点表示,无论其宽度如何。
neighbors结果缓冲区,保存可从给定 node 直接访问的所有导航节点的标识符。它可以具有零容量。
edgeIndiceshelper 结果缓冲区,将每个相邻节点映射到给定 node 的边缘。它可以具有零容量。
edgeIndices 中的元素索引也是 neighbors 数组中的索引,并且该 edgeIndices 元素的值是 edgeVertices 数组中的索引。
verticesCount描述输入 node 的几何体的顶点总数。这与 vertices 结果缓冲区的容量无关。
neighborsCount输入 node 连接到的导航节点的总数。这与结果缓冲区(neighborsedgeIndices)的容量无关。

返回

PathQueryStatus 如果 Unity 可以计算指定节点的邻居和顶点,则为 /Success/(无论结果如何)。verticesCountneighborsCount 在此情况下始终有效。
如果 Unity 无法使用 node 标识符获取邻居或几何体信息,则为 /Failure/。在此情况下,Unity 不修改五个结果参数(edgeVerticesneighborsedgeIndicesverticesCountneighborsCount)中的任何一个。
如果指定导航节点在查询的 NavMeshWorld 中不是有效 的,则 InvalidParam 是返回标志的一部分。
当提供的任何结果缓冲区大小不足以容纳输入 node 连接到的所有相邻节点或是其所有边缘顶点时,BufferTooSmall 是 Unity 从此函数返回的 PathQueryStatus 标志的一部分。

描述

获取给定 node 的顶点以及它连接到的所有导航节点的标识符

NavMesh 表面的多边形连接到它与其共享边缘的所有其他相邻多边形,以及从其表面上任何位置离开的所有 OffMeshLinks 或 NavMeshLinks。该多边形不连接到它仅与其共享顶点的其他多边形。
edgeVertices 数组中返回的每个点都表示 node 边缘的起点,数组中的后续元素是该边缘的终点。所有顶点组成闭合多边形线。最后一个元素和第一个元素定义最后一条边。

网格外链接连接到链接每端所相交的所有 NavMesh 多边形(无论链接是否为单向)。
对于链接节点,返回的 edgeVertices 数组在索引 [0]-[1] 和 [2]-[3] 处包含两对点,用于按此顺序定义链接起始边缘和结束边缘的端点。这些是在 NavMesh 世界中实例化链接时建立的世界位置。对于通过网格外链接组件添加的节点,这些对在其两个元素中包含相同值。

来自 neighbors 数组的节点处于 edgeIndices 中在相同索引处返回的边缘上。
如果给定 node 及其邻居都是 NavMesh 多边形,则对应 edgeIndices 值表示从 node 到邻居的多边形边缘的索引。例如,edgeVertices[edgeIndices[2]] 表示在 nodeneighbors[2] 节点之间公共的边缘的起点,而 edgeVertices[edgeIndices[2] + 1] 是该边缘的终点。
NavMesh 多边形可以具有最多 6 条边缘。这表示与多边形-多边形连接对应的 edgeIndices 值介于 0 与 5(含)之间。边缘通常仅连接到共享它的两个多边形,但是处于瓦片边框上的边缘可以将第一个瓦片中的一个多边形连接到第二个瓦片中的多个多边形。在此情况下,edgeIndices 会对所有这些邻居报告相同值。
如果给定 nodeneighbor链接,则对应 edgeIndices 值表示链接上建立连接的一端:0 表示起点,2 表示终点。当 node 是多边形并且 neighbor 是链接时,值仅充当有关链接上两个节点建立连接的一端的信息,不应用作 edgeVertices 数组中的索引。
neighborsedgeIndices 缓冲区都具有正容量时,其大小必须相同,否则当此方法在编辑器中执行时会遇到 ArgumentException

对于不需要结果的情况,可以将任何缓冲区设置为具有零容量。

返回的 verticesCountneighborsCount 值表示在具有足够大小的输出缓冲区中构成结果的元素数。容量不足的缓冲区仍会使用有效节点进行填充,直到其容量填满。

五个结果参数(edgeVerticesneighborsedgeIndicesverticesCountneighborsCount)不充当输入,不会以任何方式更改内部导航数据。Unity 仅当操作返回 Success 状态时才会修改这些参数。

另请参阅:NavMeshQuery.GetPolygonTypeNavMeshQuery.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<byte>(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 &amp; 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(); } }