有一个问题,我想我知道它为什么会发生但不是解决问题的正确方法。
我的导航网格代理在一个圆圈中挑选一个随机点并随机走一段时间,当位置有效时,它看起来像这样正常。
但是每隔一段时间,经纪人就会选择一个不能走路的地方而只是站在那里,因为它已被分配走路然后再挑选另一个并再次移动,而这种情况无法实现。
我知道它不移动的原因是因为路径无效(或者至少我认为这就是原因。)
但我尝试过这样的事情而没有运气。
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);
}
}
答案 0 :(得分:4)
当您怀疑操纵Unity组件的最佳方式时,为什么不咨询他们的API documentation?
您可以检查世界位置(例如随机散点)是否在NavMesh上,并且检查是这样的:
NavMesh.Raycast(point, point, out navHit)
这会尝试从位置跟踪光线投射'对于它自己,如果没有生成NavMesh则返回false,该点位于网格下方或远高于网格。
然后,您可以使用以下内容找到与此点最近的边缘:NavMesh.FindClosestEdge(point, out navHit)
如果为true - 找到最近的边,则有效的航点位置将存储在navHit.position
。
如果你的图表是可以通过的,看起来你已经有一些NavMesh的区域没有连接到你的代理所在的区域。
你应该考虑:
NavMesh.FindClosestEdge()
的其他处理,例如添加生成path的附加步骤,以验证原点和目标是否位于同一网格上。如果它们不是(并且路径无效),则执行一些额外步骤,例如移动点并重新测试,直到找到有效路径。