版本: 2022.3
语言英文
  • C#
实验性: 此API为实验性,可能在将来被修改或删除。

NavMeshQuery.Raycast

建议更改

成功!

感谢您帮助我们提高Unity文档的质量。虽然我们无法接受所有提交,但我们确实会阅读用户提出的每项建议,并在适用的情况下进行更新。

关闭

提交失败

由于某些原因,您的建议无法提交。请稍后再尝试一次。感谢您花时间帮助我们提高Unity文档的质量。

关闭

取消

声明

public Experimental.AI.PathQueryStatus Raycast(out AI.NavMeshHit hit, Experimental.AI.NavMeshLocation start, Vector3 targetPosition, int areaMask, NativeArray<float> costs);

参数

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(); } }

声明

public Experimental.AI.PathQueryStatus Raycast(out AI.NavMeshHit hit, NativeSlice<PolygonId> path, out int pathCount, Experimental.AI.NavMeshLocation start, Vector3 targetPosition, int areaMask, NativeArray<float> costs);

参数

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(); } }