4

遇到问题,我想我知道为什么会这样,但不是解决问题的正确方法。

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

    }
4

1 回答 1

4

当您怀疑操作 Unity 组件的最佳方式时,为什么不查阅他们的API 文档呢?

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

这会尝试跟踪从位置“点”到自身的光线投射,如果没有生成导航网格、该点位于网格下方或上方太远,则返回 false。

然后,您可以使用以下命令找到离该点最近的边缘:NavMesh.FindClosestEdge(point, out navHit)

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


如果您的图表可以通过,看起来您有一些导航网格区域未连接到您的代理所在的区域。

您应该考虑:

  • 阻止这些未连接的区域生成 NavMesh
  • 通过OffMeshLinks将这些区域连接到 NavMesh 的其余部分
  • 考虑对 进行额外的处理NavMesh.FindClosestEdge(),例如添加一个额外的步骤来生成一个路径来验证源和目标是否在同一个网格上。如果它们不是(并且路径无效),则需要一些额外的步骤,例如移动点并重新测试,直到找到有效路径。
于 2016-03-15T23:10:49.820 回答