首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Unity NavMesh障碍

Unity NavMesh障碍
EN

Stack Overflow用户
提问于 2014-07-20 22:17:00
回答 2查看 5.7K关注 0票数 4

我尝试在Unity中创建一个RTS游戏,但我在路径查找方面遇到了问题。我使用NavMesh来查找路径,它工作得很好:单元避免了静态对象。但单位之间不会互相躲避。有一个叫做NavMesh的组件,单元可以避免非静态对象,但我可以看到它不能与NavMesh代理一起工作,因为单元试图避开它自己。那么,各个单元如何避免彼此呢?

EN

回答 2

Stack Overflow用户

发布于 2015-02-06 17:31:58

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

最后一条评论。我发现在同一帧中禁用障碍和启用代理会导致小的单元位移问题,因此我必须使用协程来完成此操作:

代码语言:javascript
复制
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。我刚想起来这张支票有个奇怪的问题:

代码语言:javascript
复制
_agent.pathStatus != NavMeshPathStatus.PathComplete

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

票数 4
EN

Stack Overflow用户

发布于 2014-10-17 07:15:32

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

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

也就是说,如果你真的需要一个好的寻路系统,从the asset store上买一个或者自己做一个可能是一个更好的主意。我对Unity的寻路体验并不是很好,因为它试图用太少的自由做太多的事情。例如,(据我所知)一个NavMesh层不可能有一个NavMeshObstacle……这意味着如果你为不同的单元使用多个层,你就不能真正使用它们。(陆地/水/空气/...)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24851365

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档