Описание проблемы
Я борюсь с моими агентами NavMesh, вычисляя недопустимый путь, пока нет obvisously причин. Проблема возникает время от времени, когда они уже перемещаются с исходным допустимым путем.
На приведенном выше изображении пунктом назначения является конус в верхнем левом углу. (Не обращайте внимания на стрелку направления NavMeshAgent, я пытался переместить агента вручную, чтобы попытаться "разблокировать" его).
- При создании экземпляра я прошу своих агентов вычислить свой путь к определенной точке назначения в NavMesh (я использую NavMesh.SamplePosition, чтобы убедиться, что точка назначения находится в NavMesh). Все работает нормально. Агент находит свой путь и начинает двигаться к своей цели.
- Но во время путешествия, потихоньку, он теряет себя, пока NavMesh не изменился с первого шага. Я ничего не спрашивал, никаких новых вычислений нового пути.
Проверенные решения
-
Проверено, что пункт назначения находится в NavMesh
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; }
-
Проверял маску области моих агентов, чтобы убедиться, что они могут найти путь к месту назначения, несмотря на различные области NavMesh
-
Проверка почти каждого кадра, если путь к агенту недействителен. Если это так, вычислите новый, используя
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 ); } }
-
Отключение всего моего NavMeshObstacle на всей сцене (у моих агентов нет NavMeshObstacle на них или на их дочерних элементах)
-
Добавление дополнительных шагов между начальной и конечной точкой назначения
-
Отключено свойство AutoRepath свойства
-
Вычисление пути, сохранение всех corners и установка адресата моего агента по одному углу за раз, используя аналогичный метод этот
Примечание. Когда другой агент нажимает мой первый агент, последний, похоже, просыпается и находит свой путь.