Unity的Aniamtor使用后,里面绑定的属性就会被强制锁定,导致业务层无法做修改。属实有点难受,这篇文章就来分析下,对于锁定的属性,animator是如何处理的。
测试环境介绍:
cube上绑定animator,其中Test-4-1控制Cube4的Position为(0,10,0),Test-4-2控制Cube4的Position为(10,0,0),Rotation为(0,30,0)。Cube4的默认Postion为(50,50,50),Rotation为(0,0,30)。
我们将Aniamtor的默认状态设置为NewState(空状态,没有任何动作文件),运行游戏后,发现Cube4的Postion和Rotation都无法修改,Scale可以修改。设置成Test-4-1或者Test-4-2也是一样,说明Animator会上来将里面控制的所有属性进行锁定,跟动画片段无关。
上面我们知道了属性绑定是一次性绑定了所有属性,上面的例子中,控制了Postion和Rotation,但是Test-4-1只控制了Positon,那么在播放Test-4-1时,Rotation的数据如何赋值呢?我们分析下,此时Rotation的数据的来源有两处,第一处为:播放Test-4-1时,此时Rotaion的数据。第二处:Animator进行Bind时(一般情况下在每次被激活时),锁定所有属性时,Cube4的Rotation的数据,其实就是默认的数据。
如果我们勾选了WriteDefault,就使用第二处数据,没勾选则会使用第一处数据。
所以WriteDefault的含义就是,当动画播放时,如何处理那些当前动画片段不控制的但是被Animator的属性的数值。
测试举例,在上个例子中(Aniamtor绑定在Cube上),我们在Cube4上加入动画控制器,其中Test-4-Only会控制,Cube4的Postion,Rotation,Scale.
同时播放Test-4-1(只控制Positon),和Test-4-Only。结果是Postion和Rotation由Cube上的Animator进行控制,Scale由Cube4上的Animator控制。
经过多次测试:当多个Animator控制一个属性时,此属性的控制权选择顺序为:1.UpdateMode:Normal=UnsacledTime>AnimatePhysics 2.由层级更高的Animator>层级低的Animator。
Track相当于AnimatorController,运行时会锁定轨道上的所有属性。
1使用Default数据,2使用R1最后一帧的数据,3使用R3第一帧数据,4使用Default数据5使用R4最后一帧数据。具体使用哪个数据可以通过clip调整AnimationExtrapolation来实现,如图所示