添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

转自:http://tieba.baidu.com/p/3397037553

相信大家用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一致,不难看懂。 使用 unity 提供的NavMeshAgent 寻路 ,当有多个agent一起 寻路 时总会出现堵塞堆叠的 问题 。 本人使用了一个非常粗劣简单的 方案 解决此 问题 ,当然跟魔兽的 寻路 完全没得比,但保证有比较好的性能,且效果也还比较好。 效果如下: 10个敌人 太过基础的就不讲了。 问题 一:在 unity 使用navmeshAgent进行 多人 寻路 设置同一个终点后,所有角色都会向对应位置 寻路 ,当前面单位到达后后面单位会一直无法到达导致阻塞甚至推挤。 简单的解决 方案 是给自己同时挂上navmeshAgent组件和navmeshObstacle组件,注意两个组件不能同时开启,否则会躲避自身导致胡乱移动。 在移动时关闭navmeshObstacle,使用navmeshAgent进行 寻路 。而达到目的地 1.在Agents移动到目的地附近时主动停止Agent的行动。 2.当所有NavMeshAgent.velocity.sqrMagnitude都小于某个值时,说明大家都来到了目的地。 代码... [ Unity3D ]AI智能 寻路 精讲/敌人自动避障 寻路 精讲 在很多游戏中,敌人经常要在复杂的地形中追着主角跑,因为场景中存在很多障碍物,所以敌人的AI要足够聪明,才能找出到达目标点的最近道路,且绕开障碍物。写一个完善的 寻路 算法是比较有挑战性的,特别是在复杂的3D场景中,好在 Unity 提供了一个非常实用的 寻路 功能,只需要较少的代码即可实现复杂的 寻路 功能。 下面我将给大家介绍如何去具体实现这个功能: Unity 寻路 系统分为两部分: (1)一部分是对场景进行设置, 使其满足 寻路 算法的需求; (2)设置 寻路 者。 NavMeshAgent是 Unity 中用于 寻路 的组件,它可以自动计算角色的移动路径,并控制角色的移动。然后,我们需要在场景中创建一个地面,用于角色的移动。除了设置目标位置,我们还可以设置角色的移动速度和转向速度。在场景中选择一个角色,然后点击"Add Component",选择"Navigation",然后点击"NavMeshAgent"。当我们运行游戏时,我们可以看到角色根据鼠标点击的位置智能地移动,避免碰撞和相互干扰。以上代码将在鼠标左键点击时获取鼠标点击的位置,并将其设置为角色的目标位置。 本篇博客给读者介绍关于如何实现模型的变形,在项目开发中经常会涉及到模型的变形操作,比如如下效果图: 第一部分准备工作 首先在 Unity 中建立一个场景,在场景中放置一个球体,这个球体可以使用Max工具建立,在球体上放几张Materials,效果如下所示: 下面开始具体实现,创建一个新的MeshDeformer脚本来处理变形, 就像立方体球体组件一样,它需要一个网格过滤器来处理。 using U