有一个问题,我想我知道它为什么会发生,但不是解决问题的正确方法。
我的nav mesh代理在一个圆圈中选择一个随机点,然后朝它走一段随机的时间,当这个位置有效时,它看起来像这样正常。
但特工经常会选择一个不能走到的地方,站在那里等待分配好的时间,然后再选择另一个地点,然后再次移动,而它不能走的时候就会发生这种情况。
我知道它不移动的原因是路径无效(或者至少我认为这就是原因)。
但我尝试过这样的方法却没有成功。
private void moveTowardsWaypoint()
{
agent.ResetPath();
Vector3 newPosition = new Vector3(randomDirection.x, 0, randomDirection.y) + transform.position;
NavMeshPath path = new NavMeshPath();
Debug.Log(agent.CalculatePath(newPosition, path));
if(agent.CalculatePath(newPosition, path) == false)
{
agent.ResetPath();
StopCoroutine(walkTime());
pickWayPoint();
}
else
{
agent.SetDestination(newPosition);
}
}
最佳答案
当你怀疑操作Unity组件的最佳方法时,为什么不咨询他们的API documentation?
您可以检查世界位置(例如您的随机散布点)是否在NavMesh上,检查方式如下:NavMesh.Raycast(point, point, out navHit)
这将尝试跟踪从位置“点”到自身的光线投射,如果未生成NavMesh,则返回False,该点位于网格下方或上方太远。
然后,您可以使用以下命令找到离此点最近的边:NavMesh.FindClosestEdge(point, out navHit)
如果为真-找到最近的边,有效航路点位置将存储在navHit.position
中。
如果您的关系图有任何可供参考的地方,那么看起来您的navmesh中有一些区域没有连接到代理所在的区域。
你应该考虑:
阻止这些未连接的区域生成NavMesh
通过OffMeshLinks
考虑对NavMesh.FindClosestEdge()
的附加处理,例如添加生成path的附加步骤,以验证源和目标是否在同一网格上。如果它们不是(并且路径无效),则执行一些额外步骤,例如移动点并重新测试,直到找到有效路径。