Skip to content

Animator Layers

Unity 图层的机制,模型是如何被修改的呢?

不同图层的状态可以同时发生,同一图层同时只能执行一个状态

点击 + 可以添加一个图层,点击图层旁边的齿轮图标,会弹出一个小窗口,可以设置该图层对应的参数

属性描述
Weight(权重)这一层的权重,0 代表该层权重是 0(该层不生效),1 代表该层权重为 1(该层中的动画能完全表现)
Mask(遮罩)此层上使用的遮罩,可以限制动画的播放部位,例如只要播放上半身的动画,可以使用一个遮罩定义在上半身播放动画。设置后该图层上面会显示一个M的小图标
Blending和其他层混合的模式
Override覆盖上面的层中对应 Mask 的部位
Additive会加在之前图层的动画之上
Sync复用其他层中的状态机
IK Pass反向动力学

状态是指在图层中的小方框,当拖入动画时会自动变成的“东西”

新建一个图层,可以看到三个状态

状态名称简述
Entry入口,根据过渡进入默认状态
Any State任意状态,只要条件满足,可任意跳转到过渡的状态
Exit退出,返回到”Entry“

可以在空白处右键添加Empty(空状态),也可以将动画文件拖到Animator窗口中添加一个状态

如果当前在Project窗口选中了一个动画文件,可以通过右击右击的From Selected Clip创建一个状态,不过还是直接拖入更方便

第一个创建的状态默认是橙色的,代表默认状态,Animator会在一开始就播放,如果状态中有动画,也会被播放

橙色:默认状态,即进入就执行的动画

灰色:可通过过渡达到条件执行的动画

每个状态都可以包含一个动画,处于该状态时,Animator组件所在的物体会播放动画,选中一个状态时,会有如下选项

名称描述
Motion状态绑定的动画(Animation)
速度(Speed)动画播放的速度
乘数(Multiplier)Speed * 指定参数(float)作为运行时的播放速度
Motion Time单位化时间,指定参数(float,范围是 0~1)作为动画播放时间(可使用此制作轮盘开关)
镜像(Mirror)镜像播放,若打开”参数(Parameter)“:指定参数作(bool)为镜像的开关
周期偏移(Cycle Offset)循环偏移量,可以用来同步循环的动画,使用单位化时间(范围是 0~1),也可使用参数控制
Foot IK只用于人形动画,角色的脚是否使用 IK(反向动力学)
Write Default进入下一个状态时重置此状态所作的更改(初始化该状态没有用到的参数为默认值)

显示当前状态的过渡,选中后出现内容与在图层中选中一致

名称描述
Solo选中则只生效当前过渡,其他将被禁用
Mute选中则禁用当前过渡

如果同时选中SoloMuteMute会优先生效

表示状态之间的切换条件,一般会有一个或多个条件,用于从一个状态切换到另一个状态

右击一个状态,Make Transition后选择另一个状态即可创建过渡,在过渡中可以添加相应条件

名称描述
Solo选中则只生效当前过渡,其他将被禁用
Mute选中则禁用当前过渡

如果同时选中SoloMuteMute会优先生效

多个出过渡时可调整位置(上下)以实现优先级(上方优先级高于下方)

名称描述
Name Field名称框可以为过渡命名,用于区分俩个状态之间的多条过渡时很有用
Has Exit Time是否有退出时间为条件

退出时间是一种特殊的过渡条件,它没有依赖参数,而是根据设置的退出时间点作为条件进行状态转换。

过渡的一些参数设置

名称描述
退出时间(Exit Time)如果勾选了Has Exit Time,该参数可以设置,设置动画退出的单位化时间(单位:上一状态动画长度,如为物体打开动画/空动画可当成以秒为单位)。
例如设置为 0.75,代表动画播放到 75%时为true,如果没有其他条件,会直接切换到下一个状态。
如果 exit time 小于 1,那么状态每次循环到对应位置的时候(不管动画是否设置为循环,状态总是循环的),该条件都会为 true。比如第一次播放到 75%,第二次播放到 75%……时退出时间条件都会为 true。
如果 exit time 大于 1,该条件只会检测一次。比如 exit time 为 3.5,state 的动画会在循环 3 次后,在播放到第 4 次的 50%时为 true。
固定持续时间(Fixed Duration)勾选,下一项”过渡持续时间(Transition Duration)“以秒为单位
取消勾选,下一项”过渡持续时间(Transition Duration)“以(前一个状态的)百分数计数,1 为 100%
过渡持续时间(Transition Duration)过渡的过渡时间。两个状态在转换时,一般不会瞬间从一个状态转换到另一个状态,而是会经过平滑混合,这个属性就是设置了平滑混合的时间
过度偏移(Transition Offset)状态开始播放时的时间偏移。即后一个状态从何处开始,值为后一个状态的百分数,1 为 100%
例如设置为 0.5,则转换到下一个状态时,会从 50%的位置开始播放

上面的参数不仅可以手动修改,也可以通过过渡图预览和修改

img

可以打断状态的过渡,但尽量避免使用,比较复杂

例如以下图层

img

默认情况下,当 A 到 C 的切换触发后,状态机开始切换到 C,在切换到 C 之前无法被改变。但是,如果将 A->C 的过渡的中断源(Interruption Source)改为Current State,A->C 的过渡就可以被 A 上的一些过渡中断

在状态 A 上的过渡如下:

img

一些的原因:若勾选Ordered Interruption则只有优先级比 A->B 高的才能打断

过渡的优先级从上到下依次降低,即优先级A->B>A->C>A->D

  • 如果勾选Ordered Interruption

    如果此时 A->B 的切换触发,则会中断 A->C,触发 A->B

    但如果此时 A->D 的切换触发,不会中断 A->C,还是触发 A->C

  • 如果不勾选Ordered Interruption

    此时 A->B 或 A->D 的切换触发都会中断 A->C

    如果 A->B 和 A->D 同时触发,则会优先激活 A->B,因为优先级较高

如果将 A->B 的过渡的中断源(Interruption Source)改为Next State,A->B 和 A->D 就不能中断 A->C 了

如果我们激活 A->B 后,又激活 B->D,那么 A->C 的过渡会被中断,转而切换到 D

状态 B 上的过渡顺序也会有影响,但此时Ordered Interruption无法勾选(因为 A->B 是在状态 A 上,不在状态 B 上,不参与 B 的排序)。状态 B 上的过渡顺序会决定同时触发时会使用哪一个过渡,例如下图过渡

如果 B->C 和 B->D 同时触发,则优先执行 B->C

Current State Then Next State(当前状态然后下一状态)
Section titled “Current State Then Next State(当前状态然后下一状态)”

如果将 A->B 的过渡的中断源(Interruption Source)改为Current State Then Next State,则状态 A 与状态 B 的过渡都会被考虑在内

如果 A->B 切换时,同时激活的 A->C, A->D, B->C 和 B->D(不勾选Ordered Interruption

Current State Then Next State(当前状态然后下一状态),先看状态 A 的过渡,由于 A->C 的优先级比 A->D 高,则将执行 A->C,因结果已出,不用再考虑下一状态 B

Current State Then Next State(当前状态然后下一状态)
Section titled “Current State Then Next State(当前状态然后下一状态)”

与上一个相反

名称描述
Ordered Interruption优先级高于当前过渡才可以打断
无(None)不可打断
Current State前一个状态开始的状态过渡可以打断正在进行的状态过渡
Next State从后一个状态开始的状态过渡可以打断正在进行的状态
Current State Then Next State决定哪个动画 State 上的过渡节点优先权更高,先看前一个 State 的优先级如果没有被触发,再看后一个 State 的优先级,来达到不同的融合与打断效果
Next State Then Current State决定哪个动画 State 上的过渡节点优先权更高,与上一个相反

过渡条件,一个过渡可以有一个条件,也可以有多个条件,甚至没有条件

  • 如果没有条件,但是勾选了Has Exit Time,那么Exit Time会被作为状态退出的条件,到达Exit Time时,会切换到下一个状态

  • 如果有一个或多个条件,需要同时满足这些条件才能切换到下一个状态

条件可以通过参数设置,具体如下

参数类型描述
Int 型可选择 Greater(>)、Less(<)、Equals(==)、NotEqual(!=)指定的数作为过渡条件
Float 型可选择 Greater(>)、Less(<)指定的数作为过渡条件
Bool 型可选择指定值(true or false)作为过渡条件
Trigger条件为 true 时触发状态过渡

如果Has Exit Time勾选了,并且过渡还有一个或多个条件,那么过渡需要同时满足到达Exit Time,同时条件全为 true,才会切换到下一个 state

一个过渡至少要有一个条件(Has Exit Time 可以作为一个条件),否则过渡将会被忽略(不会被执行进入下一个状态)

注:Trigger 貌似在 VRChat 中没有作用,至少我不知道