有一个问题,我想我知道它为什么会发生,但不是解决问题的正确方法。
我的nav mesh代理在一个圆圈中选择一个随机点,然后朝它走一段随机的时间,当这个位置有效时,它看起来像这样正常。
c# - Unity Nav Mesh Agent目标无效?-LMLPHP
但特工经常会选择一个不能走到的地方,站在那里等待分配好的时间,然后再选择另一个地点,然后再次移动,而它不能走的时候就会发生这种情况。
c# - Unity Nav Mesh Agent目标无效?-LMLPHP
我知道它不移动的原因是路径无效(或者至少我认为这就是原因)。
但我尝试过这样的方法却没有成功。

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)
这将尝试跟踪从位置“点”到自身的光线投射,如果未生成NavMesh,则返回False,该点位于网格下方或上方太远。
然后,您可以使用以下命令找到离此点最近的边:NavMesh.FindClosestEdge(point, out navHit)
如果为真-找到最近的边,有效航路点位置将存储在navHit.position中。
如果您的关系图有任何可供参考的地方,那么看起来您的navmesh中有一些区域没有连接到代理所在的区域。
你应该考虑:
阻止这些未连接的区域生成NavMesh
通过OffMeshLinks
考虑对NavMesh.FindClosestEdge()的附加处理,例如添加生成path的附加步骤,以验证源和目标是否在同一网格上。如果它们不是(并且路径无效),则执行一些额外步骤,例如移动点并重新测试,直到找到有效路径。

10-08 14:06