我尝试在Unity中创建一个RTS游戏,但我在路径查找方面遇到了问题。我使用NavMesh来查找路径,它工作得很好:单元避免了静态对象。但单位之间不会互相躲避。有一个叫做NavMesh的组件,单元可以避免非静态对象,但我可以看到它不能与NavMesh代理一起工作,因为单元试图避开它自己。那么,各个单元如何避免彼此呢?
发布于 2015-02-06 17:31:58
我知道这已经有一段时间了,但在过去的几个小时里,我一直面临着同样的问题。我最终成功地混合了两个组件(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因此,我目前没有使用它,因为从我设置所需目的地的那一刻起,它总是正确的。这一定是同时使用这两个组件时出现的错误。我已经把它换成了剩余的距离检查。
发布于 2014-10-17 07:15:32
NavMeshAgent已具有用于避开其他代理的radius。您可以尝试增加此半径,看看是否有帮助。
此外,您可以使用"avoidancePriority"变量来调整要避免的代理的优先级。您可以编写一个脚本,根据您周围其他代理的数量来更改此值。
也就是说,如果你真的需要一个好的寻路系统,从the asset store上买一个或者自己做一个可能是一个更好的主意。我对Unity的寻路体验并不是很好,因为它试图用太少的自由做太多的事情。例如,(据我所知)一个NavMesh层不可能有一个NavMeshObstacle……这意味着如果你为不同的单元使用多个层,你就不能真正使用它们。(陆地/水/空气/...)
https://stackoverflow.com/questions/24851365
复制相似问题