什么会导致NavMesh代理计算无效路径?

时间:2017-01-14 10:06:01

标签: unity3d artificial-intelligence navmesh

问题描述

我正在努力让我的NavMesh代理商计算无效路径,而 obvisously 没有理由。当问题已经移动时,问题会不时出现,并带有初始有效路径。

Agent can't find his way

在上图中,目的地是左上角的圆锥体。 (不要介意NavMeshAgent的方向箭头,我试图用手移动代理人,以便尝试解锁"他)

  • 当实例化时,我要求我的代理计算他们到NavMesh 上的给定目标点的路径(我使用NavMesh.SamplePosition来确保目标点在NavMesh上)。一切正常。代理找到他的方式并开始朝着他的目标前进
  • 但是,在旅途中,突然之间,他失去了自己,而 NavMesh 自第一步以来没有改变。我没有问他任何事情,也没有新的计算方法。

测试解决方案

  1. 检查目的地是否在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. 检查我的座席area mask以确保他们能找到目的地的路径,尽管NavMesh的各个区域

  3. 如果代理的路径无效,则几乎检查每个帧。如果是,请使用CalculatePathSetDestination计算新的。有时,它有效,有时不行。

    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. 计算路径,存储所有corners并使用与this one类似的方法一次设置我的座席的目的地

  8. 注意:当另一个代理推送我的第一个代理时,后者似乎会醒来并找到它的路径。

3 个答案:

答案 0 :(得分:1)

我有同样的问题前一段时间,我的代理人只是在主要道路上不断恶化,就好像它在移动中获得新信息一样,

然后我检查了它并且知道它在移动时更新它的路径总是检查新的最短距离要经过,因为你说你已经禁用了自动路径属性我做了相同但没有帮助。

然后我提出想法获取我的代理人最初开始在列表中移动的点数并绘制我自己的路径以移动我的代理 你可以从this获得积分 之后你必须顺利地将你的玩家\代理人转移到这些点上,因为这将是最短的路径。

但最后但并非最不重要的避障可能难以克服

如果你发现这个帮助全部给它拍摄并说明它是怎么回事。 正是我在我的案例中所做的就是分享它会有所帮助。

祝你好运 此致

答案 1 :(得分:0)

我最近遇到了一个非常类似的问题,我的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/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/

答案 2 :(得分:0)

如果可以,请避免使用NavMeshAgent系统。我们最终得到了一些技巧,比如在整个关卡的所有兴趣点之间自动测试关卡传递能力。我们采取了一些启发式措施,例如向前迈出一小步以避免出现问题。由于他们选择的方法,Unity NavMesh系统完全被破坏。它们使用float32对网格执行非强健的布尔运算,这导致了退化的三角形和大量其他问题。不要使用它,尝试找到其他经过验证的解决方案。