Unity Nav Mesh Agent 目的地无效?

Unity Nav Mesh Agent Destination Invalid?

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

我的 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)

这会尝试跟踪从位置 'point' 到自身的光线投射,如果没有生成 NavMesh,则返回 false,该点在网格下方或上方太远。

然后你可以找到离这个点最近的边缘:NavMesh.FindClosestEdge(point, out navHit)

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


如果您的图表有任何依据,那么看起来您的 NavMesh 的某些区域未连接到您的代理所在的区域。

您应该考虑:

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