Unity Nav Mesh代理目的地无效?

时间:2016-03-15 20:27:43

标签: c# unity3d artificial-intelligence path-finding navmesh

有一个问题,我想我知道它为什么会发生但不是解决问题的正确方法。

我的导航网格代理在一个圆圈中挑选一个随机点并随机走一段时间,当位置有效时,它看起来像这样正常。 enter image description here

但是每隔一段时间,经纪人就会选择一个不能走路的地方而只是站在那里,因为它已被分配走路然后再挑选另一个并再次移动,而这种情况无法实现。

enter image description here

我知道它不移动的原因是因为路径无效(或者至少我认为这就是原因。)

但我尝试过这样的事情而没有运气。

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);
        }

    }

1 个答案:

答案 0 :(得分:4)

当您怀疑操纵Unity组件的最佳方式时,为什么不咨询他们的API documentation

您可以检查世界位置(例如随机散点)是否在NavMesh上,并且检查是这样的: NavMesh.Raycast(point, point, out navHit)

这会尝试从位置跟踪光线投射'对于它自己,如果没有生成NavMesh则返回false,该点位于网格下方或远高于网格。

然后,您可以使用以下内容找到与此点最近的边缘:NavMesh.FindClosestEdge(point, out navHit)

如果为true - 找到最近的边,则有效的航点位置将存储在navHit.position

如果你的图表是可以通过的,看起来你已经有一些NavMesh的区域没有连接到你的代理所在的区域。

你应该考虑:

  • 阻止这些未连接区域生成NavMesh
  • 通过OffMeshLinks
  • 将这些区域连接到NavMesh的其余部分
  • 考虑NavMesh.FindClosestEdge()的其他处理,例如添加生成path的附加步骤,以验证原点和目标是否位于同一网格上。如果它们不是(并且路径无效),则执行一些额外步骤,例如移动点并重新测试,直到找到有效路径。