gpt4 book ai didi

c# - Unity Nav Mesh Agent 目的地无效?

转载 作者:太空狗 更新时间:2023-10-30 01:16:12 25 4
gpt4 key购买 nike

遇到问题我想我知道它为什么会发生但不知道解决问题的正确方法。

我的 Nav Mesh agent 在一个圆圈中随机选择一个点,然后朝它走一段随机的时间,当该位置有效时,它看起来像这样正常。 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 documentation ?

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

这会尝试跟踪从位置“点”到自身的光线转换,如果没有生成 NavMesh、点在网格下方或上方太远,则返回 false。

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

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


如果您的图表有任何依据,看起来您的 NavMesh 的某些区域未连接到您的代理所在的区域。

您应该考虑:

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

关于c# - Unity Nav Mesh Agent 目的地无效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36021471/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com