Unity NavMesh障碍

时间:2014-07-20 14:17:00

标签: unity3d path-finding navmesh

我尝试在Unity中创建一个RTS游戏,我遇到路径查找问题。我使用NavMesh进行路径查找,效果很好:单位避免使用静态对象。但单位不会相互避免。单元中有一个名为NavMesh障碍的组件可以避免非静态对象,但我可以看到它不适用于NavMesh Agent,因为单位试图避免自己。 那么单位如何相互避免?

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:0)

NavMeshAgent已具有用于避免其他代理的半径。您可以尝试增加此半径,看看是否有帮助。

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

那就是说,如果你真的需要一个好的寻路系统,最好在the asset store找一个或者自己做一个。我对Unity寻路的经历并不是很好,因为它试图用太少的自由做太多事情。例如,(据我所知)不可能为单个NavMesh图层设置NavMeshObstacle ...这意味着如果您为不同的单位使用多个图层,则无法真正使用它们。 (陆地/水/空气/...)