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

Hel*_*ium 17 artificial-intelligence unity-game-engine navmesh

问题描述

我与我的导航网格代理挣扎的同时有计算路径无效obvisously没有理由.当问题已经以初始有效路径移动时,问题会不时发生.

特工无法找到自己的方式

在上图中,目的地是左上角的圆锥体.(不要介意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;
    }
    
    Run Code Online (Sandbox Code Playgroud)
  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 );
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  4. 禁用整个场景中的所有NavMeshObstacle(我的代理没有任何NavMeshObstacle,也没有他们的孩子)

  5. 在初始位置和最终目的地之间添加更多步骤

  6. 禁用代理的AutoRepath属性

  7. 计算路径,存储所有角落,并使用与角色类似的方法一次设置我的座席的目的地

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

小智 1

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

然后我检查了它,并了解到它在移动时更新其路径,总是检查要经过的新的最短距离,正如您所说,您已禁用自动路径属性,我也做了同样的事情,但没有帮助。

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

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

如果您发现这对您有帮助,请尝试并告诉您进展如何。这正是我在我的案例中所做的,认为分享它会有所帮助。

祝你好运