Unity NavMesh Obstacle



我尝试在Unity中创造一款RTS游戏,但我在寻径方面遇到了问题。我使用NavMesh进行寻径,它工作得很好:单元避免了静态对象。但单位之间不会相互回避。有一个组件称为NavMesh障碍的单位可以避免非静态对象,但正如我所看到的,它不与NavMesh代理工作,因为单位试图避免自己。那么单位之间如何相互回避呢?

我知道已经有一段时间了,但我在过去的几个小时里一直面临着同样的问题。我终于设法混合了这两个组件(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;
}

之后,只需使用代理方法来计算路径。顺便说一句,你可以在播放模式下通过选择导航选项卡实时看到导航网格,包括单位的障碍。

希望这对你有帮助!

p。我刚想起来这张支票有个奇怪的问题:

_agent.pathStatus != NavMeshPathStatus.PathComplete

所以我目前没有使用它,因为从我设置所需目的地的那一刻起,它总是为真。这一定是同时使用两个组件的错误。我已将其替换为剩余距离检查

NavMeshAgent已经有了一个用来避开其他代理的半径。你可以试着增加这个半径,看看是否有帮助。

此外,您可以使用"avoidancePriority"变量来调整要避免的代理的优先级。您可以编写一个脚本,根据您周围其他代理的数量来更改此值。

也就是说,如果你真的需要一个好的寻径系统,那么最好在资产商店中获得一个或自己制作一个。我在Unity寻径方面的经验并不是很好,因为它试图用太少的自由做太多的事情。例如,它是(据我所知)不可能有一个单一的NavMesh层的NavMeshObstacle…这意味着如果你为不同的单位使用多个图层,你就不能真正使用它们。(土地/水/空气/…)

最新更新