Unity3d 统一导航网障碍

Unity3d 统一导航网障碍,unity3d,path-finding,navmesh,Unity3d,Path Finding,Navmesh,我试图在Unity中创建RTS游戏,但我在路径查找方面遇到了问题。我使用NavMesh进行路径查找,效果很好:单位避免静态对象。但单位之间不会相互回避。有一个名为NavMesh的组件可以避免非静态对象,但正如我所看到的,它不适用于NavMesh代理,因为单位试图避免自身。 那么,单位如何能够相互避开呢?一个NavMeshAgent已经有了一个半径,可以用来避开其他代理。你可以试着增加这个半径,看看是否有帮助 此外,可以使用变量调整要避免的代理的优先级。您可以制作一个脚本,根据您周围其他代理的数量

我试图在Unity中创建RTS游戏,但我在路径查找方面遇到了问题。我使用NavMesh进行路径查找,效果很好:单位避免静态对象。但单位之间不会相互回避。有一个名为NavMesh的组件可以避免非静态对象,但正如我所看到的,它不适用于NavMesh代理,因为单位试图避免自身。
那么,单位如何能够相互避开呢?

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

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


这就是说,如果你真的需要一个好的寻路系统,那么最好是自己制作一个。我对Unity的寻路体验不是很好,因为它试图用太少的自由做太多的事情。例如,(据我所知)不可能为单个NavMesh层设置NavMesh障碍物。。。这意味着,如果您为不同的单元使用多个层,则无法真正使用它们。(陆地/水/空气/…)

我知道这已经有一段时间了,但在过去的几个小时里我一直面临着同样的问题。我最终成功地混合了这两个组件(NavMeshAgent和NavMesh)。唯一的要求是不能同时启用它们。我的策略是禁用代理并启用障碍(启用雕刻选项),当我移动一个单位时,禁用障碍并启用代理

最后一句话。我发现在同一帧中禁用障碍物和启用代理会导致一个小的单元位移问题,因此我必须使用协同程序来实现这一点:

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;
}
之后,只需使用代理方法计算路径。顺便说一句,您可以在播放模式下选择导航选项卡,实时查看navmesh,包括装置的障碍物

希望这有帮助

顺便说一句,我刚想起这张支票有一个奇怪的问题:

_agent.pathStatus != NavMeshPathStatus.PathComplete

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

我遇到了完全相同的问题,而协同程序似乎无法解决它。有什么想法吗<代码>public void MoveTo(Vector3 destination){target=destination;start例程(EnableAgent());}private IEnumerator EnableAgent(){barrier.enabled=false;yield return new WaitForEndOfFrame();agent.enabled=true;agent.SetDestination(target);yield return new WaitForEndOfFrame();isMoving=true;}private void DisableAgent(){agent.enabled=false;disabled.enabled=true;isMoving=false;}