当我在Unity中用 "剩余距离 "设置了一个不可到达的目标位置时,为什么会出现这样的情况?SetDestination()
为我的NavMeshAgent和 Debug.Log()
的 NavMeshAgent.remainingDistance
每一帧,我得到 Infinity
直到它开始返回浮点数(21.21864, 21.0846, 20.95449......),直到它尽可能地接近目标位置,返回0。
从Unity 2019.3开始,NavMeshAgent.remainDistance仍然只有在到达路径的倒数第二个角,并且代理正在穿越最后一段之后才会计算。在此之前,剩余距离将返回无穷大。遗憾的是,这一点并没有被记录下来。
这里有一个NavMeshAgent的扩展方法,可以在任何时刻,或者路径的任何一点获得剩余距离。
public static class ExtensionMethods
{
public static float GetPathRemainingDistance(this NavMeshAgent navMeshAgent)
{
if (navMeshAgent.pathPending ||
navMeshAgent.pathStatus == NavMeshPathStatus.PathInvalid ||
navMeshAgent.path.corners.Length == 0)
return -1f;
float distance = 0.0f;
for (int i = 0; i < navMeshAgent.path.corners.Length - 1; ++i)
{
distance += Vector3.Distance(navMeshAgent.path.corners[i], navMeshAgent.path.corners[i + 1]);
}
return distance;
}
}
因此,你可以使用NavMeshAgent.GetPathRemainingDistance()来代替NavMeshAgent.res remainingDistance。请注意,这可能会造成性能上的损失,所以在使用时要注意这一点。
至于您的问题的第二部分,我们需要更多的背景信息,但听起来您的目标位置可能会对向上的矢量产生偏移,而代理被限制在x,z平面上,但这只是推测。