ControlRig程序化动画配合BreakConstraint物理模拟,在用户操作时偶发引擎卡死,无堆栈信息

在使用ControlRig制作四足怪物行走动画时,为实现“断肢后自动匹配新动画”的需求,我采用了以下方案:

  1. 使用两个Locomotor组件分别计算了正常状态与断肢状态下的两组Transform数据。
  2. 在ControlRig中,根据从动画蓝图传入的“断肢状态”变量,动态选择用于FullBody IK的目标骨骼和对应的Transform数据源。
  3. 断肢的物理表现通过Break Constraint节点并启用Simulate Physics来实现。

目前遇到一个严重问题:游戏引擎会发生偶发性的、完全卡死的崩溃。崩溃发生时:

  • 无任何错误信息或调用堆栈输出。
  • 崩溃难以稳定重现。当在动画蓝图中使用循环逻辑不断切换断肢状态时,从未触发崩溃;但如果在测试过程中存在玩家的实时输入操作,则有可能偶然触发卡死。
  • 动画蓝图向ControlRig传递状态变量时,已使用 AccessProperty 节点以确保线程安全。

与崩溃相关的额外详情及分析

  • 关键线索:崩溃仅在与玩家输入结合时偶然发生,暗示问题可能与输入事件驱动下的状态更新时序、物理模拟(Simulate Physics)的激活、以及ControlRig的实时解算三者之间的交互竞争条件或资源访问冲突有关。
  • 崩溃前操作:触发崩溃前,通常正在执行“接收玩家输入 -> 更新动画状态 -> 触发断肢 -> ControlRig尝试重新定向IK目标”这一连贯操作。输入带来的不可预测性可能放大了某些时序问题。
  • 怀疑方向:
  1. 线程安全问题:虽然动画蓝图使用了 AccessProperty,但Break Constraint触发的物理模拟、Locomotor的计算、以及ControlRig在同一帧内的解算,可能涉及引擎不同线程(如游戏线程、物理线程、动画线程)对同一组骨骼或Actor数据的访问冲突。
  2. 资源状态同步:断肢瞬间,物理刚体的生成与动画系统的目标切换可能未能完美同步,导致ControlRig在某一帧内获取到了无效或正在被物理系统修改的Transform数据。

[Attachment Removed]

重现步骤

  1. 基础压力测试:在蓝图中设置自动化循环,频繁地在“正常”与“多种断肢”状态之间切换,以尝试触发状态处理逻辑的边界问题。结果:未能重现崩溃。
  2. 复合操作测试:在进行上述状态循环的同时,引入玩家输入(如移动、旋转角色)。结果:在此条件下,偶然会触发引擎卡死,但无固定模式。

[Attachment Removed]

嗨,同学,您好,我希望能帮您一起排查一下这个问题。

从您的文字描述来看,涉及的操作过多,可能崩溃的可疑点也比较多,而且还是偶现,单单从文字描述比较难判断您的具体问题,我们暂时也没收到其他类似的反馈。

如果可以的话,希望您能提供一个脱敏的最小现场工程和相关的操作视频,我来帮您排查一下。

任何其他有用的现场信息也可提供一下(log或者dump)。

期待您的回复。

[Attachment Removed]