Начиная с 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;
}
}
Поэтому вместо использования NavMeshAgent.remainingDistance Вы можете использовать NavMeshAgent.GetPathRemainingDistance (). Имейте в виду, что в зависимости от ситуации это может стоить производительности, поэтому имейте это в виду при ее использовании.
Что касается второй части вашего вопроса, нам потребуется больше контекстной информации о вашей настройке, но звучит как ваша целевая позиция может иметь смещение в сторону восходящего вектора, в то время как агент ограничен плоскостью x, z, но это только предположение.