Что может заставить агента NavMesh вычислить неверный путь?

Описание проблемы

Я борюсь с моими агентами NavMesh, вычисляющими неверный путь, в то время как нет очевидных причин. Проблема возникает время от времени, когда они уже движутся с первоначальным допустимым путем.

Агент не может найти свой путь

На изображении выше, пункт назначения - конус в верхнем левом углу. (Не обращайте внимания на стрелку направления NavMesh Agent, я попытался переместить агента вручную, чтобы попытаться "разблокировать" его)

  • После создания экземпляра я прошу моих агентов вычислить их путь к заданной точке назначения в NavMesh (я использую NavMesh.SamplePosition, чтобы убедиться, что точка назначения находится в NavMesh). Все отлично работает Агент находит свой путь и начинает двигаться к своей цели
  • Но, во время путешествия, он внезапно теряет себя, в то время как NavMesh не изменился с первого шага. Я ничего не спрашивал у него, нет новых вычислений нового пути.

Решения проверены

  1. Проверил пункт назначения на НавМеш

    public Vector3 GetCharacterPositionOnNavMesh( Vector3 position )
    {
        NavMeshHit hit;
        bool positionFound = NavMesh.SamplePosition( position, out hit, 500, NavMesh.AllAreas );
    
        if ( !positionFound )
            Debug.LogWarning( "No valid position found !" );
    
        return positionFound ? hit.position : position;
    }
    
  2. Проверил маску области моих агентов, чтобы убедиться, что они могут найти путь к месту назначения, несмотря на различные области NavMesh

  3. Проверка почти каждого кадра, если путь агента недействителен. Если так, вычислите новый, используя CalculatePath или же SetDestination, Иногда это работает, иногда нет.

    protected virtual void Update()
    {
        if ( !Running || !agent.enabled || !agent.isOnNavMesh )
            return;
    
        if ( !agent.pathPending && agent.path.status == NavMeshPathStatus.PathInvalid && Time.frameCount % 2 == 0 )
        {
            NavMeshPath path = new NavMeshPath();
            agent.CalculatePath( CharactersManager.Instance.GetCharacterPositionOnNavMesh( finalDestination ), path );
            agent.SetPath( path );
        }
    }
    
  4. Отключение всего моего NavMeshObstacle на всей сцене (у моих агентов нет ни NavMeshObstacle ни на них, ни на их дочерних элементах)

  5. Добавление дополнительных шагов между начальной позицией и конечным пунктом назначения

  6. Отключено свойство AutoRepath агента

  7. Вычисление пути, сохранение всех углов и установка пункта назначения моего агента по одному углу за раз, используя метод, подобный этому

Примечание. Когда другой агент толкает моего первого агента, последний, похоже, просыпается и находит свой путь.

3 ответа

У меня была та же проблема Когда-то назад, когда мой агент продолжал ухудшаться по основному пути, как будто он получал новую информацию на ходу,

Затем я проверил это и узнал, что он обновляет свой путь на ходу, всегда проверяя новое кратчайшее расстояние, чтобы пройти, как вы сказали, что вы отключили свойство auto Path, я сделал то же самое, но без помощи.

Затем мне пришла в голову идея получить очки, по которым мой агент изначально начинает перемещаться в списке, и нарисовать мой собственный путь, по которому мой агент может двигаться дальше. Вы можете получить очки от этого, и после этого вам нужно будет плавно перевести вашего игрока \ агента. в этих точках, поскольку это будет кратчайший путь.

Но последнее, но не менее важное, преодоление препятствий может быть трудно преодолеть

если вы найдете эту помощь полностью, дайте ей шанс и расскажите, как это происходит. это то, что я сделал в моем случае, поделился, что это будет полезно.

Удачи С наилучшими пожеланиями

Если вы можете, просто избегайте использования системы NavMeshAgent. В результате мы получили такие приемы, как автоматическое тестирование прохождения уровня между всеми интересующими объектами для всего уровня. Мы сделали некоторую эвристику, например, прыгали вперед на маленькие шаги, чтобы избежать проблем. Система Unity NavMesh полностью сломана из-за подхода, который они выбрали. Они выполняют ненадежные логические операции для сеток, используя float32, и это привело к вырожденным треугольникам и огромному количеству других проблем. Не используйте это, попробуйте найти другие проверенные решения.

У меня недавно была очень похожая проблема, когда мои агенты NavMesh зависали и обычно начинали вращаться, когда пункт назначения находился слишком близко к краю NavMesh. Что исправило это для меня, так это отодвинул его от края на половину радиуса агента, поэтому, когда он достигнет пункта назначения, он будет стоять прямо над ним.

Если это тебе не поможет - можешь попробовать warping агент:

https://forum.unity.com/threads/agents-get-stuck-on-navmeshlink.503527/ https://forum.unity.com/threads/agent-getting-stuck-in-another-agent-when-walking-in-corners-what-is-the-right-solution.501824/ https://forum.unity.com/threads/strange-navmeshsurface-behavior.501453/ https://forum.unity.com/threads/ не удалось создать агента, потому что он не достаточно близко к navmesh.500553 / https://forum.unity.com/threads/navmesh-link-does-not-connect-properly-in-runtime.473223/

Другие вопросы по тегам