Unity Nav Mesh Agent Destination Invalid?

我遇到了一个问题,我认为我知道问题的原因,但不知道如何正确解决这个问题。

我的Nav Mesh代理会在一个圆圈中随机选择一个点,然后朝这个点走一段随机的时间,当位置有效时,看起来是正常的,像这样。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);        }    }

回答:

当你对如何操作Unity组件感到疑惑时,为什么不查阅他们的API文档呢?

你可以检查一个世界位置(比如你的随机散点)是否在NavMesh上,像这样进行检查:NavMesh.Raycast(point, point, out navHit)

这试图从位置’point’到自身进行射线检测,如果没有生成NavMesh,或者点在网格下方或离网格太远,则返回false。

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

如果返回true – 找到了最近的边缘,有效的路径点位置将存储在navHit.position中。


如果你的图表有什么可循的话,看起来你的NavMesh有些区域与你的代理所在区域不相连。

你应该考虑以下几点:

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

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注