Unity3D 中 CapsuleCollider 碰撞挤压将对象挤到空中的问题

这几天一直在尝试着修改各种战斗中的 Bug,优化一些战斗细节等等,然后发现了在某些怪和主角对抗的时候,有的时候主角会莫名其妙地被挤到空中去,有的时候是怪在攻击主角的过程中把自己给挤到空中去了。你说这能忍吗?显然不行,对伐。

然后就开始使劲浑身解数尝试着在不同的状态下,主动控制怪和主角不要离开地面(通过动态获取目标所在位置点的地表 Y 坐标值,然后设置为目标的 Y 坐标),可是这又谈何容易呢,先不说这么做合不合理,优不优雅了,这一眼看上去就不是啥好招啊,而且实际上并没有找到为神马会出现相互挤压就会把某一方给挤到空中去的原因,那么我们肯定不能善罢甘休的,对伐?

接下来我们来看两个图:capusle_collider_1动图 1 capsule_collider_2动图 2

上方的动图 1 中,我们看到绿色的 Capsule 朝着红色的 Capsule 快速移动,并且在移动的过程中与其发生了碰撞,碰撞之后绿色和红色的 Capsule 错开,然后绿色 Capsule 继续运动了一段时间。从动图 2 中,我们能看到绿色的 Capsule 在与红色的 Capsule 碰撞之后继续运动的过程中,明显有被挤到空中的情况。咦,貌似我们已经发现什么了呢。

那我们再来对比一下这两个 Capsule 的设置值,到底是哪个参数导致的呢?

capsule_collider_inspector_1 capsule_collider_inspector_2

从上面的两张图对比中来看的话,其实只有一个 Capsule 的 Scale 调整了 Y 为 2,同时 Y 坐标也因为 Capsule 变高了所以变高了。如此一来,这个绿色的高个子的 Capsule 在与红色的矮个子 Capsule 发生碰撞和挤压的时候就会因为质心过高而被挤到空中去。如果希望避免这种情况,可以考虑将所有的 Capsule Collider 的中心点值和高度值都统一设置。