在本人撰写的《Unity中使用动画状态机控制Spine动画》中介绍了在Unity中使用Animator来控制Spine动画的播放、切换等基本操作,接下来介绍Spine动画在Unity中基于Animator的分层和混合的简单操作。

动画分层

基本概念

Spine动画可分层应用动画,每个动画层存储了一些动画和播放参数,没有任何关键帧的动画可在高层中运行,只覆盖有关键帧的低层动画。分层有许多用途,例如Layer0可以有行走、奔跑、游泳或其他动画,Layer 1可以有一个只为手臂和开枪设置了关键帧的射击动画。此外,在Unity中为高层动画设置权重可使其与下面的轨道混合。例如,Layer0可以有一个行走动画,Layer1可以有一个跛行动画。当玩家受伤时,使Layer1的权重增加,跛行会加重。还可以动画分层来管理复杂状态机中的不同身体部位。例如,如果你有一个用于步行跳跃的下半身层,以及一个用于投掷物体/射击的上半身层。
接下来将演示一个低层控制人物运动状态,高层控制人物开枪射击的样例。

创建新的动画层

把Spine动画导入到Unity中并创建了Animator之后,打开Aniamtor视图,点击如下按钮创建新的动画层:

spine网络架构中的stem spine层级_Animator

设置基本层

spine网络架构中的stem spine层级_Animator_02


在BaseLayer中添加待机动画和跑步动画,并设置过渡条件。

设置新动画层

在NewLayer中新建一个空的动画状态,并作为新动画层的默认状态。再添加射击动画,设置空状态和射击状态的过渡条件。

spine网络架构中的stem spine层级_Unity_03

设置权重

权重的大小表示此层动画的可见程度。

Unity中最低层的权重默认为1,且不能修改。而新层的权重默认为0,即不可见。为了让其表现出来,这里我修改新层权重为1,即完全可见。

若权重设置为0到1之间的值,高层动画有关键帧的部分将与低层有关键帧的相同部分产生混合效果,混合程度取决于权重大小。

spine网络架构中的stem spine层级_Animator_04


之前新建了一个空状态的意义是,当人物没有进入开枪状态时,只有移动状态层的表现,而开枪层不需要有任何表现,故设置空状态,使其和下方动画层叠加而不对下层产生影响。

效果

运行后,可让移动和开枪分别控制,分别表现,而互不影响。

待机:

spine网络架构中的stem spine层级_spine网络架构中的stem_05


跑动:

spine网络架构中的stem spine层级_Animator_06


跑动中开枪:

spine网络架构中的stem spine层级_spine网络架构中的stem_07


待机中开枪:

spine网络架构中的stem spine层级_动画层_08

动画混合

游戏动画中常见的需求是在两个或更多相似动作之间进行混合。例如根据角色的速度混合步行和跑步动画。还有在跑步期间转弯时向左或向右倾斜的角色。
而在Unity中混合动画可用混合树来实现。
接下来演示在Unity中Spine动画混合行走和跑步的样例。

新建混合树

在Animator视图中任意空白位置点击右键,如下所示新建混合树:

spine网络架构中的stem spine层级_Animator_09


此时自动新建了一个动画参数,在这里名为Blend。

spine网络架构中的stem spine层级_动画层_10

设置Motion

双击新建的混合树动画状态,进入混合树编辑界面

spine网络架构中的stem spine层级_spine网络架构中的stem_11


在Inspector视图中新建Motion

spine网络架构中的stem spine层级_Spine_12


新建2个Motion,然后把行走动画和跑步动画的动画剪辑文件拖拽入下图所示的框内:

spine网络架构中的stem spine层级_spine网络架构中的stem_13


此时Blend Type默认为1D,其他混合类型可查阅官方文档,这里只讨论类型为1D的情况。

混合参数

之前自动创建的混合参数Blend影响两个动画混合的程度。若Blend为0,则混合后,上层动画占100%,下层动画占0%;若Blend为1,则反之;取中间值,则以相应的程度混合。

spine网络架构中的stem spine层级_Spine_14

效果

取Blend参数为0.5,即跑步动画和走路动画个混入一半,效果如下:

spine网络架构中的stem spine层级_动画层_15


spine网络架构中的stem spine层级_Unity_16


表现上为步伐的长度和频率、腰的直立程度介于跑步和走路之间。