我遇到了一个问题,我认为我知道问题的原因,但不知道如何正确解决这个问题。
我的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文档呢?
你可以检查一个世界位置(比如你的随机散点)是否在NavMesh上,像这样进行检查:NavMesh.Raycast(point, point, out navHit)
这试图从位置’point’到自身进行射线检测,如果没有生成NavMesh,或者点在网格下方或离网格太远,则返回false。
然后你可以找到这个点最近的边缘,像这样:NavMesh.FindClosestEdge(point, out navHit)
如果返回true – 找到了最近的边缘,有效的路径点位置将存储在navHit.position
中。
如果你的图表有什么可循的话,看起来你的NavMesh有些区域与你的代理所在区域不相连。
你应该考虑以下几点:
- 阻止这些不相连的区域生成NavMesh
- 通过OffMeshLinks将这些区域连接到NavMesh的其他部分
- 考虑对
NavMesh.FindClosestEdge()
进行额外的处理,比如添加一个额外的步骤,生成一个路径来验证起点和终点是否在同一个网格上。如果它们不在同一个网格上(并且路径无效),可以采取一些额外的步骤,如移动点并重新测试,直到找到有效路径为止。