Qu'est-ce qui pourrait amener un agent de NavMesh à calculer un chemin invalide?

Description du problème

j'ai du mal avec mes Agents NavMesh qui calculent un chemin invalide alors qu'il y a obvisously pas de raisons. Le problème se produit de temps à autre quand ils sont déjà en mouvement avec un chemin valide initial.

Agent can't find his way

sur l'image ci-dessus, la destination est le cône dans le coin supérieur gauche. (Ne faites pas attention à la flèche de direction du NavMeshAgent, j'ai essayé de déplacer l'agent à la main afin que pour essayer de "déverrouiller")

  • une fois instancié, je demande à mes agents de calculer leur chemin vers un point de destination donné sur le NavMesh (j'utilise NavMesh.SamplePosition pour s'assurer que le point de destination est sur le NavMesh). Tout fonctionne très bien. L'agent trouve son chemin et commence à se déplacer vers sa cible
  • mais, pendant ce voyage, soudain, il se perd alors que le NavMesh n'a pas changé depuis la première étape. Je ne lui ai rien demandé, pas de nouveau calcul d'un nouveau chemin.

Solutions testées

  1. vérifié la destination est sur le 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;
    }
    
  2. coché le masque de zone de mes agents pour s'assurer qu'ils peuvent trouver un chemin vers la destination malgré les différentes zones du NavMesh

  3. vérifier presque chaque image si le chemin de l'agent est invalide. Si oui, calculer un nouveau en utilisant CalculatePath ou SetDestination. Parfois, cela fonctionne, parfois pas.

    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. désactiver tout mon NavMeshObstacle sur toute la scène (mes agents n'ont pas de NavMeshObstacle sur eux ni sur leurs enfants)

  5. ajouter plus d'étapes entre la position initiale et la destination finale

  6. Désactivé AutoRepath propriété de la l'agent

  7. Calcul du chemin d'accès, le stockage de toutes les coins et paramétrer la destination de mon agent un coin à la fois en utilisant une méthode similaire à celui-ci

Remarque : Lorsqu'un autre agent pousse mon premier agent, ce dernier semble se réveiller et de trouver son chemin.

15
demandé sur Hellium 2017-01-14 13:06:00

3 réponses

j'ai eu le même problème il y a quelque temps où mon agent continue juste de se détériorer pour former le chemin principal comme s'il recevait de nouvelles informations sur le mouvement,

puis j'ai vérifié et j'apprends à savoir qu'il met à jour son chemin sur le mouvement en vérifiant toujours la nouvelle distance la plus courte à parcourir car vous avez dit que vous avez désactivé la propriété auto Path j'ai fait la même chose mais pas d'aide.

puis j'ai eu l'idée d'obtenir les Points sur lesquels mon agent a commencé à se déplacer dans un liste et tracer mon propre chemin pour déplacer mon Agent sur Vous pouvez obtenir les points de et après cela u doivent traduire en douceur votre joueur\agent sur ces points car il sera le chemin le plus court.

Mais le dernier mais non le moins, l'évitement d'obstacle peut être difficile à surmonter

si vous trouvez cette aide complète lui donner coup et de dire comment il va. c'est juste ce que j'ai fait dans mon cas pensé que le partage serait utile.

Bonne Chance Ce qui concerne

0
répondu Syed Anwar Fahim 2017-01-23 11:58:56

j'ai récemment eu un problème très similaire où mes agents de NavMesh étaient coincés et commençaient habituellement à tourner autour quand la destination était trop proche du bord du NavMesh. Ce qui a arrangé ça pour moi, c'est de l'éloigner du bord par la moitié du rayon de l'agent pour que, quand il atteindra sa destination, il soit juste au-dessus.

Si ce n'est pas vous aider, vous pouvez essayer warping la agent:

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/failed-to-create-agent-because-it-is-not-close-enough-to-the-navmesh.500553/ https://forum.unity.com/threads/navmesh-link-does-not-connect-properly-in-runtime.473223/

0
répondu Fiffe 2017-11-20 07:51:33

si vous le pouvez, évitez D'utiliser le système NavMeshAgent. Nous sommes finis avec des trucs comme auto-tester la capacité de passage de niveau entre tous les points d'intérêt pour le niveau entier. Nous avons fait quelques heuristiques comme sauter en avant pour un petit étapes pour éviter les problèmes. Le système Unity NavMesh est complètement cassé à cause de l'approche qu'ils ont choisi. Ils effectuent des opérations booléennes non-robustes pour les mailles en utilisant float32 et cela a entraîné des triangles dégénérés et un grand nombre d'autres problèmes. Ne l'utilisez pas, essayez de trouver d'autres solutions éprouvées.

0
répondu FadeToBlack 2018-03-22 11:36:00