我正在使用Unity的导航网格系统制作一款坦克RTS游戏。
当坦克相互靠近时,躲避系统就会启动,它们试图避开对方。然而,他们经常会撞到对方,最后把其他人推开。对于像坦克这样重的车辆来说,这是不可能的,而且看起来很不自然。
有没有办法让导航网特工尽量避开对方,但不要撞到对方,如果他们撞到了,绝对不要推搡对方?
我试过改变避障优先级,但至少总有一辆坦克会把其他坦克推开。
我还尝试过改变刚体,例如使固定式坦克在重力作用下工作,并使其变得非常重。我还冻结了所有刚体约束。然而,其他坦克仍然能够轻松地将它们推开。
目前,当坦克停止移动时,我在它们下面出现了一个导航网障碍物,这有助于躲避。然而,只有当它们是静止的时,这才有效——移动的坦克仍然可以被其他人推来推去。
任何关于如何解决这个问题的想法或建议都将不胜感激!
虽然我不是Unity或NavMeshAgents的专家,但我最近也遇到了类似的问题,即代理不切实际地相互推搡。就我而言,这是人们在机场排队扫描登机牌,但我向你保证,这看起来并不比坦克更荒谬。
我花了几个小时在互联网上搜索,又花了几个月的时间进行试错,我很遗憾地说,没有快速或简单的解决方案。坦率地说,Unity内置的寻路人工智能系统既粗糙又不稳定。还记得早在2006年;英雄连";如果只行驶很短的距离,坦克会倒车而不是掉头吗?是的,15年后,如果没有广泛的自定义脚本,Unity的NavMeshAgents仍然无法做到这一点。。。
不过有几个想法!
想法1:在我们提出可能的建议之前,对这个问题的另一种看法是,从一开始就让环境或游戏阻止坦克相互碰撞。我的意思是,当然,在城市中心混乱的战斗中,这种情况偶尔会发生,但从我个人对现实生活中坦克战的理解来看,它们几乎从未真正接触过。。。如果你的大型远程火炮具有全地形踏面机动性,却被另一辆坦克(如停车场挡泥板弯曲器)撞坏了,那就大错特错了。仔细想想,我看到的NavMeshAgents推搡问题中更大的问题是步兵推搡坦克时。在现实生活中,它们更有可能直接跑到踏板旁,或从坦克后面的掩护下倾斜,或躲在主炮塔炮管下。因此,如果你的RTS游戏既有坦克也有步兵,并且所有坦克和步兵都通过NavMesh和NavMeshAgents进行寻路,你还有其他几个原因需要担心。
无论如何,我的观点是,也许你可以实现某种脚本,让同一侧的坦克保持队形?尽最大努力与盟军坦克保持最小距离?当脚本离另一辆坦克太近时,可能会将它们的前进速度降低到零,或者其他形式的硬/软检查,以防止盟军坦克试图进入彼此的碰撞距离内。至于敌方坦克,同样,只有在非常卡通的情况下,当两辆坦克都处于活跃的战斗状态时,它们才会相互撞击。如果一辆坦克是一堆冒烟的瓦砾,或者被其乘员遗弃,那么禁用NavMeshAgent并在其位置放置NavMesh障碍物就可以了。
事实上,你曾经玩过/看过2005年的任天堂游戏";营战"?现在有一个游戏,我认为可以公平地描述为遵循对坦克战的松散解释,更不用说物理定律了。。。即使在那个愚蠢的游戏中,坦克也很少相互碰撞。还记得2003年的游戏吗;智囊团"?这是一场节奏非常快的坦克混战,在极少数情况下,一辆坦克撞上了另一辆,有人被掀翻了,每个人都笑了。
如果你正在制作一个抽象的游戏或一个轻松愚蠢的游戏,没有人会在乎一两辆坦克是否被推了一下。如果这是一个严肃的游戏或历史模拟类型的RTS,为什么坦克会撞到对方?
我离题了。我的观点是,坦克不切实际地相互推挤的问题可以通过游戏策略或限制坦克与其他坦克距离的幕后代码来最小化。然后,他们是否假设会互相推搡也没关系,因为它很少出现,当它出现时,很可能会处于非常活跃和短暂的状态,而玩家极不可能注意到或关心。
第二个想法:但我知道什么?所以这里有一些限制颠簸的想法!我看到了一些论坛帖子和博客文章,讨论了只使用NavMeshAgent组件来确定路径的想法,并使用一个单独的脚本来制作带有实际Animator的对象,或者你一直在做什么;追逐;NavMeshAgent。这通常是在汽车的背景下提出的。但汽车和坦克并没有太大的不同,从根本上来说是运动"追逐";隐形NavMeshAgent在狭小的空间里可能有点笨重,但与该组件可能设计用于步行的类人机器人相比,坦克很难灵活。也许这对你来说是一个可行的解决方案,这取决于你期望在任何给定时间活动的坦克数量。刚体物理和其他碰撞的东西将更可预测,更容易控制,你唯一会依赖NavMeshAgent的是";转向";使用其他脚本移动的坦克。
想法#3:完全不同的想法是将NavMeshAgent与主游戏对象的根位置部分解耦。官方的在线Unity手册甚至在这里提到了这一点,他们给出了一些简单的技巧来尽量减少足部滑动。坦克没有脚,但整个坦克滑动基本上都是一样的问题,对吧?如果从视觉上讲,坦克实际上并没有移动,因为你正在通过脚本重置它的变换位置,也许你可以故意让坦克相互推挤一点。
想法4:我发现NavMeshAgent组件的优先级设置非常无用。只有当你非常确定你希望特工移动的确切顺序时,它才会产生实际的影响,几乎是以预先写好的方式。在动态程序RTS游戏中没有太大帮助。也就是说,是否有可能实现某种脚本,根据一些战场标准更改单个坦克的优先级设置?当然,这不会完全阻止坦克相互推搡,但可能会动态限制。例如,你可以让两个移动中的坦克相互碰撞,自动将坦克移动速度设置为较低的优先级。或者,一个比附近任何坦克都大的坦克,可能由某个标签值决定,被设置为比其他坦克低的优先级。这将比所有在开始时指定静态默认优先级值的储罐更有帮助,因为储罐的优先级将根据物理上邻近的其他储罐和相关变量而变化。
因此,受损的坦克不太可能绕过新的坦克。后退的坦克比前进的坦克更不可能推动其他坦克。浅河中央的坦克或其他什么东西都无法推动坐在岸边更坚实地面上的坦克。如果您可以通过脚本在NavMeshAgent组件中实现动态优先级设置,这可能会有所帮助。感性的游戏最终比视觉现实主义更重要,对吧?
思想#5:我不喜欢告诉人们使用第三方插件来解决他们的问题。尤其是我不亲自使用的。也就是说,你还可以考虑研究Unity Asset Store项目的功能,如A*(发音A-Star)或其他旨在取代或至少改进内置Unity系统的插件。大约100美元是昂贵的,盗版这些插件是不道德的,所以如果你真的走这样的路,我建议你在冒险之前直接联系制作它们的人,询问你的具体问题。同样,我个人并不使用它们,但如果我不在这里提及它们,那将是不负责任的。
如果他们来找我,我会通过编辑这个回复添加更多想法,但我希望我可能已经给了你一些你能做什么的线索。请,如果你真的找到了一个有效的解决方案,请告诉我们!!!RTS游戏开发商需要所有他们能得到的帮助,许多其他人也有类似的问题,代理不是坦克。祝你好运