寻路最终版哦

转自: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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值