17

问题描述

我正在为我的 NavMesh 代理计算无效路径而苦苦挣扎,而显然没有任何理由。当他们已经在使用初始有效路径移动时,有时会出现问题。

经纪人找不到路

在上图中,目的地是左上角的圆锥。(不要介意 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. 检查了我的代理的区域掩码,以确保他们可以找到通往目的地的路径,尽管 NavMesh 的各个区域

  3. 如果代理的路径无效,则检查几乎每一帧。CalculatePath如果是这样,使用or计算一个新的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. 计算路径,存储所有角落并使用与此类似的方法一次设置我的代理的目的地

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

4

3 回答 3

1

我遇到了同样的问题 前段时间,我的代理只是从主要路径上不断恶化,好像它在移动中获取新信息一样,

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

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

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

如果您发现此帮助充分,请给它一枪并告诉它是如何进行的。这正是我在我的案例中所做的,认为分享它会有所帮助。

祝你好运

于 2017-01-23T11:58:56.973 回答
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-走进角落-what-is-the-right-solution.501824/ https://forum.unity.com/threads/strange-navmeshsurface-behavior.501453/ https://forum.unity.com/threads/未能创建代理-因为它不是关闭足够到导航网格.500553/ https://forum.unity.com/threads/navmesh-link-does-not-connect-正确运行时.473223/

于 2017-11-20T07:51:33.583 回答
0

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

于 2018-03-22T11:36:00.297 回答