在动画器控制器中左侧除了参数这个选项之外,还有一个图层选项
这里面的第一个Base Layer就是目前我们看到的动画器控制器图层,然后我们也可以创建自己的图层
每一个图层默认有三个状态:1.Entry:入口状态(执行动画的入口) ;2. any state :任意动画状态 --- 这个状态表示所有的动画状态,然后任何一个动画状态都不能过渡到它,但它能过渡到任意一个状态
且最重要的特性是:当这个任意状态过渡到某个动画状态a时,则所有的动画状态(除a本身)都能够过渡到动画状态a
第三个状态是结束状态 -- 连接后动画执行到这的时候就会自动结束
子状态机
在一个图层中我们不仅可以创建混合树,我们还可以创建子状态机(这个子状态机其实就是当前图层的一个子图层),双击这个子状态机我们可以进入到这个子图层中
(我们的动画状态可以过渡到子状态机中,也可以从子状态机中过渡出来(通过返回父图层))
当然,状态机与状态机直接也能够相互过渡
一个子状态机种有四个默认状态(子状态机其实是一个子图层,而在这个子图层中我们也可以创建混合树和子状态机)
在这个子状态机中多的一个默认状态是返回父图层,我们在子状态机做完了动画之后可以直接连接返回父图层或者是直接连接结束
其实所谓的父图层,子图层可以用面向对象编程的继承来理解(多半这个代码实现也是用这个)
父图层是总的动画调动,组图层中是每个动画的细节实现
比如说那枪的动画和拿刀的动画各有一个子图层去实现,当我们要过渡到拿枪动画的时候直接从父图层连接到子图层就好了
(这种设计框架可以让我们更有效率,同时减少动画的复杂度)
我们也可以创建一个新的父图层,当我们创建了新的父图层并在父图层中添加了动画后,点击游戏运行我们会发现:两个父图层的动画在同时播放!!! --- 其实创建一个新图层就相当于在创建一个子线程,然后两个图层通过协程的方式同步运行
但是有意思的来了,我们会发现在游戏场景中的角色只会执行一个图层中的动画(且这个图层在界面版中有条蓝线衬着)
这时候我们点开每一个图层都有的小齿轮,点开后可以看到一个参数面板,这个参数面板都是对图层的调整
这里面有一个权重选项,当当前图层的权重为0的时候,会优先执行权重更大的动画,当权重为0到1之间的时候,则当前图层的动画会与旧图层逐步形成融合动画来播放(且越靠近1新图层的动画比重越大),当为1的时候,新图层的动画播放就会将旧图层的动画播放覆盖掉,只会播放新图层的动画
(混合模式是随着权重的改变而改变的 --- 0:被覆盖,0~1:融合,1:覆盖)
知道了上面这些后我们就可以实现一个功能了 ---- 让人物的上半身执行图层2的动画,下半身执行图层1的动画
这个功能该怎么实现呢? -- 这就要用到图层参数中的遮罩了
1.首先在assets中创建一个 avater 遮罩(骨骼遮罩)文件,创建好后我们就可以在inspector检查面板中看到下面这个图了
上面这个图中绿色区域就是我们要做动画的区域(默认是所有区域都要做动画)
点一下这个人体骨骼的附近任意一个区域,这个人就会从全绿切换到全红,全红就是全都不做动画
然后我们再单独点击这个人体骨骼中的分块(单独点击的分块会单独变绿)--- 骨骼上的每一条线都是不同块的分界线
点绿的部分就是会被做动画的部分
2.做完上面这个骨骼遮罩文件之后把这个骨骼遮罩文件拖到做上半身动画的图层处,此时这个图层的遮罩参数就会变成我们拖给它的骨骼遮罩文件,此时图层中的所有动画都只有绿色部分能够进行播放
此时图层的权重也只能在绿色部分得到体现,如果说这个图层的权重参数为1的话,则其权重在这个新的骨骼遮罩文件中的绿色部分权重为1,则其是该绿色部分唯一一个能够播放动画的图层,而这个图层管不到的红色区域则会交给下一个图层去管(如果下一个图层也为红则继续交给下一个,如果实在没有,则这部分没有动画播放)
完成上半身我们再完成下半身,这样我们就能够实现上下半身同时播放不同图层的动画了