hit | 包含raycast结果的属性。 |
start | 射线在NavMesh上的起始位置。 start.polygon 必须为NavMeshPolyTypes.Ground类型。 |
targetPosition | 射线的期望结束位置,在世界坐标中。 |
areaMask | 位掩码,将索引位置与区域类型相关联。索引从0到31。在相关的索引位置中,您必须将该值设置为1或0。1表示射线可以穿过的区域类型。0表示阻止射线穿过的区域类型。此参数是可选的。如果您省略此参数,则默认为NavMesh.AllAreas。有关更多信息,请参阅:区域和成本。 |
costs | 包含所有32种可能区域类型的自定义成本值数组。它们作为射线跨越各种区域时报告的距离的乘数。此参数是可选的。如果您省略它,则默认为您在项目设置中配置的区域成本。有关更多信息,请参阅:NavMesh.GetAreaCost。 |
PathQueryStatus Success
如果射线可以用提供的参数正确追踪。
Failure
如果start
位置在查询的NavMeshWorld中无效,或者它位于areaMask
参数不允许的区域内部,或者是位于NavMeshLink / OffMeshLink上。
在NavMesh上的两点之间绘制线。
此方法与NavMesh.Raycast类似,它们共享相同的底层实现。
使其不同的属性包括
hit.distance
受区域成本的影响;hit.position
如果存在垂直方向的高度网格,则不会根据高度网格调整;返回的 hit.distance
代表了起始点和终止点之间的直线距离。它还考虑了提供的区域成本列表。这是通过将穿过每个独立区域的射线路径上的所有距离相加,再乘以该区域成本所得的结果。
首先,在 NavMeshWorld 中验证起始位置是否有效,并将目标点映射到 NavMesh 上。然后,从起始点向目标点射出一条射线。如果计算成功,则 hit
数据将填充射线所到达的最远点的信息。这无论从源到目标的路径是否被阻挡都适用。
如果计算失败,返回的 hit
将填充无效数据。最值得注意的是,hit.distance
字段获取 positiveInfinity
的值。
如果射线追踪终止在外部边缘,hit.mask
为 0;否则,它包含阻挡多边形的区域掩码。
您可以使用此函数来检查代理是否可以在 NavMesh 上的两点之间无障碍行走。例如,如果您的角色有一种需要空间的逃避闪避动作,您可以从角色的位置向多个方向发射射线。这可以找到角色可以躲避的位置。
与 NavMeshQuery.Raycast 不同的是,Physics raycast。NavMeshQuery.Raycast 可以检测所有的导航障碍,例如地面的空洞。如果该区域是可导航的,它还可以爬上斜坡。
// TargetReachable using Unity.Collections; using UnityEngine; using UnityEngine.AI; using UnityEngine.Experimental.AI;
public class TargetReachable : MonoBehaviour { public Transform target; NavMeshQuery m_NavQuery; NavMeshHit m_Hit;
void OnEnable() { m_NavQuery = new NavMeshQuery(NavMeshWorld.GetDefaultWorld(), Allocator.Persistent); }
void Update() { var startLocation = m_NavQuery.MapLocation(transform.position, Vector3.one, 0); var status = m_NavQuery.Raycast(out m_Hit, startLocation, target.position, NavMesh.AllAreas, new NativeArray<float>()); if ((status & PathQueryStatus.Success) != 0) { Debug.DrawLine(transform.position, target.position, m_Hit.hit ? Color.red : Color.green);
if (m_Hit.hit) Debug.DrawRay(m_Hit.position, Vector3.up, Color.red); } }
void OnDisable() { m_NavQuery.Dispose(); } }
hit | 包含raycast结果的属性。 |
path | 将填充射线通过的多边形序列的缓冲区。 |
pathCount | 报告的射线通过的多边形数量,所有这些存储在 path 缓冲区中。它不会大于 path.Length 。 |
start | 射线在NavMesh上的起始位置。 start.polygon 必须为NavMeshPolyTypes.Ground类型。 |
targetPosition | 射线的期望结束位置,在世界坐标中。 |
areaMask | 一个位字段,指定在射线路线被追踪时哪些 NavMesh 区域可以穿越。此参数是可选的。如果不填写此参数,则默认为 NavMesh.AllAreas。 |
costs | 影响射线在不同区域类型上报告的距离的成本乘数。此参数是可选的。如果省略它,则默认为您在项目设置中配置的区域成本。 |
PathQueryStatus Success
如果射线可以用提供的参数正确追踪。
Failure
如果start
位置在查询的NavMeshWorld中无效,或者它位于areaMask
参数不允许的区域内部,或者是位于NavMeshLink / OffMeshLink上。
BufferTooSmall
是当提供的 path
缓冲区不足以容纳射线通过的所有多边形时返回的标志之一。
在 NavMesh 上两点之间绘制一条线,并返回通过它的多边形列表。
即使 path
缓冲区太小,它也会从射线的起源位置开始存储尽可能多的多边形。
附加资源:PolygonId。
// StraightPathFromRay using Unity.Collections; using UnityEngine; using UnityEngine.AI; using UnityEngine.Experimental.AI;
public class StraightPathFromRay : MonoBehaviour { public Transform target; NavMeshQuery m_NavQuery; NavMeshHit m_Hit; NativeArray<PolygonId> m_Path; int m_PathCount;
void OnEnable() { m_Path = new NativeArray<PolygonId>(3, Allocator.Persistent); m_NavQuery = new NavMeshQuery(NavMeshWorld.GetDefaultWorld(), Allocator.Persistent); }
void Update() { var startLocation = m_NavQuery.MapLocation(transform.position, Vector3.one, 0); PathQueryStatus status = m_NavQuery.Raycast(out m_Hit, m_Path, out m_PathCount, startLocation, target.position, NavMesh.AllAreas, new NativeArray<float>()); if ((status & PathQueryStatus.Success) != 0) { var bufferTooSmall = (status & PathQueryStatus.BufferTooSmall) != 0; Debug.DrawLine(transform.position, m_Hit.position, bufferTooSmall ? Color.black : Color.green);
if (m_Hit.hit) Debug.DrawRay(m_Hit.position, Vector3.up, Color.red); } }
void OnDisable() { m_NavQuery.Dispose(); m_Path.Dispose(); } }