问题描述
我正在为我的 NavMesh 代理计算无效路径而苦苦挣扎,而显然没有任何理由。当他们已经在使用初始有效路径移动时,有时会出现问题。
在上图中,目的地是左上角的圆锥。(不要介意 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
如果是这样,使用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 ); } }
在整个场景中禁用我的所有 NavMeshObstacle(我的代理没有任何 NavMeshObstacle 在他们身上,也没有在他们的孩子身上)
在初始位置和最终目的地之间添加更多步骤
禁用代理的AutoRepath属性
注意:当另一个代理推动我的第一个代理时,后者似乎会醒来并找到它的路径。