相信大家用unity3d自带navmeshagent寻路的时候,一定会碰到多人寻路相互挤压的问题。
这个我已经解决了,而且已经应用到我们的项目中,感觉还不错。
首先提下问题的原因:navmeshagent在寻路的时候,并不会把别人当成障碍物,而是在即将和其他agent碰撞的时候,通过减速,碰撞转弯,实现避开其他agent.
但这在游戏中是无法接受的体验。
国外有一个人用了一个办法,大幅的减少了碰撞和挤压的行为,网址:
http://www.gamedev.net/page/resources/_/technical/game-programming/pathfinding-and-local-avoidance-for-rpgrts-games-using-unity-r3703
他用了代理的方法,非常聪明,而且你看它的例子,几乎感觉到完美。但经过我的测试,实际情况还是会可能出现挤压和卡主的情况。
所以如果你的寻路物体足够多,我建议用这种方式解决,首先效率很高,表现的也足够好。而且对于大量物体寻路,少数卡顿本来也是合理的。
第二种方法我不推荐,但也许是我自己实现不对,那么就是navmesh obstruct, 这个可以挖洞,挖洞之后寻路的时候就会把别人当成障碍物。
但是有三个问题。1,寻路组件和障碍物组件不能同时存在,也就是你要自己处理何时寻路,何时是障碍物。 2. 挖洞并不是实时,而且挖的洞如果刚好形成了一个凹变形,那么狠不幸的,你的寻路要绕老远了。 3.偶尔会卡死,我通过vs attach,发现是Navmesh底层汇编卡死了,原因不明。 当然也许是我没用好,不过我最终放弃了这种方法。