我尝试在 Unity 中创建 RTS 游戏,但在寻路方面遇到问题。我使用 NavMesh 进行寻路,效果很好:单位避免静态对象。但单位不会互相回避。有一个名为 NavMesh Obstacle 的组件可以避免非静态对象,但正如我所看到的,它不适用于 NavMesh Agent,因为单位试图避免自身。
那么各单位之间如何避让呢?
最佳答案
我知道已经有一段时间了,但在过去的几个小时里我一直面临着同样的问题。我终于设法混合了这两个组件(NavMeshAgent 和 NavMeshObstacle)。唯一的要求是它们不能同时启用。我的策略是禁用代理并启用障碍物(启用雕刻选项),当我移动一个单位时,禁用障碍物并启用代理。
只是最后的评论。我发现在同一帧中禁用障碍物和启用代理会导致一个小的单位位移问题,所以我不得不使用协程来做到这一点:
public IEnumerator EnableUnitMovementCoroutine()
{
if (obstacle != null && obstacle.enabled)
{
obstacle.enabled = false;
}
yield return new WaitForEndOfFrame();
if (agent != null && !agent.enabled)
{
agent.enabled = true;
destinationSet = false;
}
yield return new WaitForEndOfFrame();
unitMoving = true;
}
在此之后,只需使用代理方法来计算路径。顺便说一句,您可以通过在播放模式下选择导航选项卡来实时查看导航网格,包括单位的障碍物。
希望这可以帮助!
附注。我只记得我在这个检查中有一个奇怪的问题:
_agent.pathStatus != NavMeshPathStatus.PathComplete
所以我目前没有使用它,因为从我设置所需目的地的那一刻起,它总是正确的。这一定是同时使用两个组件的错误。我已将其替换为剩余距离检查。
关于unity3d - unity NavMesh 障碍物,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24851365/