一、问题描述

在 Unity 下使用 Animancer 插件进行动画控制,并使用 Animation Rigging 插件来自定义 IK 骨骼约束,制作瞄准模式的动画。当 Animancer 的动画状态切换时,将导致 Animantion Rigging 的相关组件参数值重置为场景中的默认值。

该问题导致当进入定义的 IK 约束模式时,出现如下的“鬼畜”现象。

二、问题原因

该问题由于 Animancer 在底层使用了 Playable API 进行实现,而 Animancer 在切换状态时将对 Playable Graph 进行修改,因为 Animancer 需要在运行时动态的添加 Animation Clip ,而在运行时进行该修改行为将触发 Animator.Rebind() 方法,该方法使动画器相关参数被强制修改为默认值,是导致 Animation Rigging 相关参数被重置的根本原因。

官方文档的描述如下所示:

如上所述,该问题实际上会出现在所有在运行时添加 Animation Clip 、或修改 Playable Graph 的代码当中。

三、解决方案

解决方法总结为确保 Playable Graph 不被修改。

  1. 每次状态转移时会导致 Playable Graph 发生改变,默认情况下 Animancer 会在状态转移时将所有 Playable 与 Playable Graph 断开连接。因此需要设置 Animancer.Playable.KeepChildrenConnected = true ,该操作使得 Animancer 在切换状态时,不会在 Playable Graph 中断开前一个状态中的 Playable 的连接。

  2. 进入未创建过的新状态时会导致 Playable Graph 发生改变,这是因为 Animancer 进入一个未创建的状态时,将会把该状态的 Playable 与 Playable Graph 进行连接。因此需要提前将所有 ITransition 添加到 Animancer 中,即调用 Animancer.Play(ITransition),该操作使得所有的动画状态都被初始化。

除此之外,目前似乎没有正常手段可以保证 Playable Graph 被修改且不会触发 Rebind,如有更好的解决方案,欢迎讨论。

四、参考资料

Github Issue Rigs from Unity Animation Rigging package are reset whenever an animation is played with a human avatar.

Unity Discussions Runtime Animation Rig transforms reset every time I change a custom playable graph.