本文分享Unity中Animator播放动画后无法修改transform的问题

在使用Animator时, 如果某些动画状态设计到transform的改动, 比如位置, 缩放等, 在默认情况下我们就不能手动修改该对象的transform相关属性了.

比如动画修改了缩放, 不管该动画有没有执行, 只要在Animator的控制之下, 我们不管是通过代码还是通过Inspector面板都无法修改该对象的缩放值.

当然, 如果动画只是加入了缩放的关键帧, 但是并没有修改值, 那么还是可以被我们修改的.

官方的说明是: 在经过某个动画后, 如果该动画会对transform进行修改, 则对该对象的transform的控制权就移交给Animator了, 外部无法再进行修改, 直到切换到其它不会对transform进行修改的其它状态.

但是经过实际验证, 在Unity2017和2019中, 只要Animator控制的动画有对transform的修改, 不管该动画有没有被执行过, Animator就会接管transform.

我们可以通过一些小手段来避免这种情况:

  • (官方推荐)将会被动画改变transform但是也会被手动控制的对象加到一个新的父节点上, 然后动画控制该节点, 手动控制其父节点.
  • (官方推荐)在手动控制之前, 禁用掉Animator(enable=false), 修改完后再启用, 这种方式可能会有一些状态问题.
  • CullingMode设置为非Always Animate, 这种方式对于那些需要在镜头之外的动画也会有一些状态问题.
  • (终极解决方案)取消勾选HasTransformHierachy, 这种方式目前没有发现什么问题, 但是官方对该属性的说明模模糊糊, 不确认会不会有一些未知问题.

HasTransformHierachy属性说明

默认情况下该属性在Inspector面板中不可见, 需要打开Debug面板:

unity无法修改关键帧 unity animation 改帧率_unity

从字面意思和网上的说明来猜想, 之所以该属性会生效, 可能是勾选后, transform的属性会被保存, Animator控制后会使用保存的transform属性来还原手动修改.

禁用该属性后, Animator无法在动画未播放的时候获取到默认值, 所以能达到我们的目的.

当然, 具体原因不明, 如果有了解的同学, 希望联系本人, 分享给大家.