大哥们,求助一下,mesh碰撞挤飞



BUG如视频,碰撞通道如图, NPC 移动,的时候,我在他头上,卡住,很高几率,把我顶飞,飞得很离谱,大概是什么原因造成的?

已经解决! 先说结论 ,设置Enemy 和 player Mesh 和 胶囊体的 Collision Presets解决的

我是这样设置 ,让enemy 的 Mesh 与player 为 Overlap, Capsule Component 与 player 为 Block。
同样 ,player 那边的 Mesh 与 Capsule Component 也是同样的设置。 OK问题发生的几率就很小了,但没有根本解决。

然后,我简单介绍下,中间查找的过程:

  1. 最开始,我怀疑,是角色的 PhysicsAsset 参数导致的异常


    然后修改各种参数,对比Fab 下载的其他工程参数, 发现都没作用
    排除错误

  2. 怀疑是角色,身上的 Mesh 或者 Capsule Component 物理相关导致的, 但是修改物理相关参数,关闭物理模拟,发现都没作用
    排除错误

  3. 到这里已经没头绪,那只剩下,最笨的办法,跑到位移的C++函数,打个断点,然后一点点的看C++代码, 最后终于定位到问题了。 我先上个视频


    这个视频更好的表达了这个问题的原因。

先说两个机制(看C++代码发现的):
机制A:UE5 的 UCharacterMovementComponent 相关移动方法,会每tick检测的你当前的站立平台,运动状态,更新你的这些属性和状态。 检测的时候,当你脚下发生了站立平台的变化,那么会把原来的平台上得到一个”惯性速度“,Add给角色的Velocity,角色得到这个速度会在下个tick , 更新角色的运动状态。

机制B: 当一个 物体 与你 Collision Presets关系 互为Block,物体与你发生侵入状态之后,UE5会自动尝试把这个物体"推出去"

问题就在这里:

脚下出现了一个物体,与你是Block 关系,产生了侵入和"推出去", 然后改变你站立平台 和 运动状态,同时这个物体的”惯性速度“ ,给了离开 站立在这个物体上的人, 当下方那个瞬时速度非常大时,你的角色就会突然非常不合常理的飞起来。

OK,目前我所找到的原因如上, 解决这个问题有很多方法,还可以去修改计算 ”惯性速度“让它更“合理” , 我们选择了一个更简单的方法,直接修改 Collision Presets。 看到这里如果你有更好的想法,希望能分享到后面。

C++ 主要涉及的 Callstack: