我尝试在 Unity 中创建 RTS 游戏,但我遇到了寻路问题。我使用 NavMesh 进行寻路,效果很好:单位避免静态对象。但单位不会互相躲避。有一个名为 NavMesh Obstacle 的组件可以让单元避开非静态对象,但正如我所见,它不适用于 NavMesh 代理,因为单元试图避开自身。那么单位如何相互避开呢?
2 回答
我知道已经有一段时间了,但在过去的几个小时里我一直面临着同样的问题。我终于设法混合了两个组件(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;
}
在此之后,只需使用代理方法来计算路径。顺便说一句,您可以通过在播放模式下选择导航选项卡来实时查看导航网格,包括单位的障碍物。
希望这可以帮助!
PS。我只记得这张支票有一个奇怪的问题:
_agent.pathStatus != NavMeshPathStatus.PathComplete
所以我目前没有使用它,因为从我设置所需目的地的那一刻起它总是正确的。这一定是同时使用两个组件的错误。我已将其更换为剩余距离检查。
NavMeshAgent 已经具有用于避开其他代理的半径。您可以尝试增加此半径,看看是否有帮助。
此外,您可以使用“avoidancePriority”变量来调整要避免的代理的优先级。您可以编写一个脚本来根据您周围其他代理的数量更改此值。
也就是说,如果您真的需要一个好的寻路系统,最好在资产商店购买一个或自己制作一个。我对 Unity 寻路的体验并不是很好,因为它试图以太少的自由度做太多的事情。例如,(据我所知)不可能有一个 NavMeshObstacle 用于单个 NavMesh 层......这意味着如果您为不同的单元使用多个层,您将无法真正使用它们。(土地/水/空气/...)