node | 来自 NavMesh 表面、NavMeshLink 或网格外链接的节点的标识符,需要对该节点获取顶点和邻居。 |
edgeVertices | 结果缓冲区,包含描述输入导航 node 的几何体的世界位置。它可以具有零容量。NavMesh 的多边形节点具有最少 3 个,最多 6 个顶点。 OffMeshConnection 节点始终由 4 个顶点表示,无论其宽度如何。 |
neighbors | 结果缓冲区,保存可从给定 node 直接访问的所有导航节点的标识符。它可以具有零容量。 |
edgeIndices | helper 结果缓冲区,将每个相邻节点映射到给定 node 的边缘。它可以具有零容量。edgeIndices 中的元素索引也是 neighbors 数组中的索引,并且该 edgeIndices 元素的值是 edgeVertices 数组中的索引。 |
verticesCount | 描述输入 node 的几何体的顶点总数。这与 vertices 结果缓冲区的容量无关。 |
neighborsCount | 输入 node 连接到的导航节点的总数。这与结果缓冲区(neighbors 和 edgeIndices )的容量无关。 |
PathQueryStatus
如果 Unity 可以计算指定节点的邻居和顶点,则为 /Success/(无论结果如何)。verticesCount
和 neighborsCount
在此情况下始终有效。
如果 Unity 无法使用 node
标识符获取邻居或几何体信息,则为 /Failure/。在此情况下,Unity 不修改五个结果参数(edgeVertices
、neighbors
、edgeIndices
、verticesCount
或 neighborsCount
)中的任何一个。
如果指定导航节点在查询的 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]]
表示在 node
与 neighbors[2]
节点之间公共的边缘的起点,而 edgeVertices[edgeIndices[2] + 1]
是该边缘的终点。
NavMesh 多边形可以具有最多 6 条边缘。这表示与多边形-多边形连接对应的 edgeIndices
值介于 0 与 5(含)之间。边缘通常仅连接到共享它的两个多边形,但是处于瓦片边框上的边缘可以将第一个瓦片中的一个多边形连接到第二个瓦片中的多个多边形。在此情况下,edgeIndices
会对所有这些邻居报告相同值。
如果给定 node
或 neighbor
是链接,则对应 edgeIndices
值表示链接上建立连接的一端:0 表示起点,2 表示终点。当 node
是多边形并且 neighbor
是链接时,值仅充当有关链接上两个节点建立连接的一端的信息,不应用作 edgeVertices
数组中的索引。
当 neighbors
和 edgeIndices
缓冲区都具有正容量时,其大小必须相同,否则当此方法在编辑器中执行时会遇到 ArgumentException
。
对于不需要结果的情况,可以将任何缓冲区设置为具有零容量。
返回的 verticesCount
和 neighborsCount
值表示在具有足够大小的输出缓冲区中构成结果的元素数。容量不足的缓冲区仍会使用有效节点进行填充,直到其容量填满。
五个结果参数(edgeVertices
、neighbors
、edgeIndices
、verticesCount
和 neighborsCount
)不充当输入,不会以任何方式更改内部导航数据。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<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 & 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(); } }