【问题标题】:Unity Nav Mesh Agent Destination Invalid?Unity Nav Mesh 代理目标无效?
【发布时间】:2016-03-15 20:27:42
【问题描述】:

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

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

    }

【问题讨论】:

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


    【解决方案1】:

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

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

    这会尝试追踪从位置“点”到自身的光线投射,如果没有生成 NavMesh、该点低于网格或高于它太远,则返回 false。

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

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


    如果您的图表可以参考,那么您的导航网格中的某些区域似乎与您的代理所在的区域没有连接。

    你应该考虑:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-07-09
      • 1970-01-01
      • 2020-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-14
      • 1970-01-01
      相关资源
      最近更新 更多