为什么 NavMeshAgent.remainingDistance 返回 Infinity 值,然后在 Unity 中返回浮点数以表示无法到达的目的地?

Rog*_*ang 2 agent path-finding infinity unity-game-engine navmesh

SetDestination()当我为 NavMeshAgent 和Debug.Log()每一帧设置无法到达的目标位置时NavMeshAgent.remainingDistance,我会获取Infinity一些路径,直到它开始返回浮点数(21.21864、21.0846、20.95449...),直到它尽可能接近目的地,这返回 0。

Nov*_*ack 8

从 Unity 2019.3 开始,NavMeshAgent.remainingDistance 仍然仅在到达路径的倒数第二个角之后计算,并且代理正在遍历最后一段。在此之前,剩余距离将返回无穷大。可悲的是,这是没有记录的。

这是一个 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,您可以使用 NavMeshAgent.GetPathRemainingDistance(),而不是使用 NavMeshAgent.remainingDistance。请注意,根据具体情况,这可能会导致性能昂贵,因此在使用它时请记住这一点。

至于你问题的第二部分,我们需要更多关于你的设置的上下文信息,但听起来你的目标位置可能有向上向量的偏移,而代理被限制在 x, z 平面,但这只是猜测。