为什么 NavMeshAgent.remainDistance 在 Unity 中对不可到达的目标位置返回的值是 Infinity,然后是 float?

问题描述 投票:1回答:1

当我在Unity中用 "剩余距离 "设置了一个不可到达的目标位置时,为什么会出现这样的情况?SetDestination() 为我的NavMeshAgent和 Debug.Log()NavMeshAgent.remainingDistance 每一帧,我得到 Infinity 直到它开始返回浮点数(21.21864, 21.0846, 20.95449......),直到它尽可能地接近目标位置,返回0。

unity3d agent infinity navmesh pathing
1个回答
1
投票

从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平面上,但这只是推测。

© www.soinside.com 2019 - 2024. All rights reserved.