Animator Layers

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

图层 #

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

属性 描述
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 进入下一个状态时重置此状态所作的更改(初始化该状态没有用到的参数为默认值)

Transition #

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

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

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

过渡 #

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

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

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

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

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

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

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

Settings #

过渡的一些参数设置

名称 描述
退出时间(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%的位置开始播放

过渡图 #

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

中断源(Interruption Source) #

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

例如以下图层

Current State(当前状态) #

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

在状态A上的过渡如下:

一些的原因:若勾选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,因为优先级较高

Next State(下一状态) #

如果将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(当前状态然后下一状态) #

如果将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(当前状态然后下一状态) #

与上一个相反

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

Condition #

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

  • 如果没有条件,但是勾选了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中没有作用,至少我不知道