本文主要是介绍寻路最终版哦,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
转自:http://blog.csdn.net/yxriyin/article/details/40902063
相信大家用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底层汇编卡死了,原因不明。 当然也许是我没用好,不过我最终放弃了这种方法。
第三种方法,用市面上大部分自称local avoidacne的插件,包括最著名的A* pathfinding project. 这个我只能呵呵了,其实他们的行为和navemeshagent是一样的好么。不信你们可以下载一个试试。
那么问题来了,到底怎么才能实现一套不错的寻路,能让少数人之间完美的避开呢。
我最终解决了,方法如下:
A*寻路的时候把别人当成障碍物。
妈蛋,就一句话? 是的,但别小看这一句话,需要解决的难点非常的多。我主要列几个问题:
1.实时问题,即使你很好的把其他人当成障碍物,并且找到一条路径,可大家都是运动的,总有人会走到你的路径上挡住你,这怎么办。这需要通过AI策略解决。当有人挡住你,你需要停顿住,等待对方离开继续沿路行进。如果等太久,比如超过1s,那么其实就应该重新寻路。
2.性能问题。你很可能需要频繁的寻路,但A*效率比自带的低很多。我建议大家采用simple path的排队策略,能够大幅提高性能。
3.寻路物体大小和网格大小问题,物体有大有小,可能网格太小,但物体很大,怎么寻路的时候判断网格到底是不是真的可以容纳物体?这个其实不难,只要将物体的半径/网格的大小,就可以知道到底几个网格才能够行走。
4.手机上性能吃的消吗?我增加了一个策略,当寻路超过500格,就停止寻路,走向离目标最近点的格子,手机上妥妥的。
还有大量的优化的点,我就不一一例举了。
接下来你肯定要问了,说了这么多,干货呢?
哈哈,代码我已经发布到商店了,但要钱的哦。当然我其实是非常想要开源的,但目前我们游戏开发尚未完成。等做完后,我就公布这部分的代码。
当然你如果一定要慷慨解囊也是可以的。不过声明一下:我的代码通用性并不强,所以你们肯定需要根据自己游戏的实际情况做一些改动。所以我的代码主要还是用来给你们参考最核心的部分,其他细节需要你们自己优化。代码总量应该就3k+,而且大部分A*和simple path一致,不难看懂。
这是商店地址:https://www.assetstore.unity3d.com/en/#!/content/23968
这篇关于寻路最终版哦的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!