版本:Unity 6 (6000.0)
语言英语
  • C#

NavMesh.SamplePosition

提意见

成功!

感谢您帮助我们提高 Unity 文档质量。虽然我们无法接受所有提交,但我们确实会阅读从我们用户那里收到的每项建议更改,并适当地更新。

关闭

提交失败

由于某种原因,您的建议更改无法提交。请在几分钟后<a>重试</a>。感谢您抽出时间帮助我们提高 Unity 文档质量。

关闭

取消

声明

public static bool SamplePosition(Vector3 sourcePosition, out AI.NavMeshHit hit, float maxDistance, int areaMask);

参数

sourcePosition 样本查询的原点。
hit 持有结果位置的属性。hit.normal 的值永远不会被计算。它始终是 (0,0,0)。
maxDistance 在从 sourcePosition 这一距离内采集样本。
areaMask 查找到最近点时指定允许使用的 NavMesh 区域的遮罩。

返回

找到最近点为bool True;

说明

在指定范围内基于 NavMesh 查找最近点。

通过沿垂直轴将输入点投影到附近的 NavMesh 实例上来找到最近点。此垂直轴已在创建时为每个实例选择。如果此步骤未在指定距离内找到投影点,那么采样会扩展到周围的 NavMesh 位置。

根据离查询点的距离找到最近点。此函数不考虑阻碍。例如,在两层结构中,如果 sourcePosition 被设置为一楼天花板上的某点,则最近点可能位于二楼而不是一楼。天花板不被视为阻碍。

如果指定了较大的搜索半径,这个函数可能会降低帧率。为了避免帧速率问题,建议您指定一个等于代理高度的两倍的 maxDistance。

如果您尝试在 NavMesh 上找到一个随机点,您应该使用推荐半径并执行多次查找,而不是使用很大的半径。

// RandomPointOnNavMesh
using UnityEngine;
using UnityEngine.AI;

public class RandomPointOnNavMesh : MonoBehaviour { public float range = 10.0f;

bool RandomPoint(Vector3 center, float range, out Vector3 result) { for (int i = 0; i < 30; i++) { Vector3 randomPoint = center + Random.insideUnitSphere * range; NavMeshHit hit; if (NavMesh.SamplePosition(randomPoint, out hit, 1.0f, NavMesh.AllAreas)) { result = hit.position; return true; } } result = Vector3.zero; return false; }

void Update() { Vector3 point; if (RandomPoint(transform.position, range, out point)) { Debug.DrawRay(point, Vector3.up, Color.blue, 1.0f); } } }

声明

public static bool SamplePosition(Vector3 sourcePosition, out AI.NavMeshHit hit, float maxDistance, AI.NavMeshQueryFilter filter);

参数

sourcePosition 样本查询的原点。
hit 持有结果位置的属性。hit.normal 的值永远不会被计算。它始终是 (0,0,0)。
maxDistance 在从 sourcePosition 这一距离内采集样本。
filter 查找最近点时指定哪些 NavMesh 区域是允许访问的筛选器。

返回

找到最近点为bool True;

说明

在为 filter 指定的代理类型构建的任何 NavMesh 上对 sourcePosition 附近的最近位置进行采样。

仅考虑在 NavMeshQueryFilter.areaMask 中定义的区域上的位置。通过 maxDistance 设置最大的搜索半径。在 hit 参数中返回任何已找到位置的信息。