U3L18-2——动画分层和遮罩

本章代码关键字

1
2
animator.GetLayerIndex()        //通过层级名字获取索引
animator.SetLayerWeight(,); //设置某个层级的权重

动画分层的主要目的

动画分层的作用
游戏中会有这样的需求
人物健康状态时播放正常动画
人物非健康状态时播放特殊动画
比如血量低于一定界限,人物的大部分动作将表现为虚弱状态
我们可以利用动画分层来快速实现这样的功能

动画分层和动画遮罩结合使用
3D游戏中我们常常会面对这样的需求
人物站立时会有开枪动作
人物跑动时会有开枪动作
人物蹲下时会有开枪动作
从表现上来看光是开枪动作可能就有3种
如果要让美术同学做3种开枪动作费时又费资源

我们是否可以这样做
比如开枪动画只影响上半身
下半身根据实际情况播放站立,跑动,蹲下动作
通过上下半身播放不同的动画就可以达到动画的组合播放

动画分层的主要就是达到这两个目的

  1. 两套不同层动作的切换
  2. 结合动画遮罩让两个动画叠加在一起播放

提升动画多样性,节约资源

利用动画分层我们可以做到

  1. 上下半身播放两个动画进行组合,比如上半身扔炸弹,下半身待机移动蹲下
  2. 快速制作正常状态和受伤状态的动作切换

如何使用动画分层

  1. 新建一个动画层
  2. 设置动画层参数
  3. 在该层中设置状态机(注意:结合遮罩使用时默认状态一般为Null状态)
  4. 根据需求创建动画遮罩

分层参数相关

image

  • Weight:权重,当动画同时播放时,如果选择的是叠加状态,会根据权重决定叠加的比例

  • Mask:动画遮罩,该层动画全部都会受该遮罩的影响

    可以单独编辑某个动画的遮罩
    也可以写一个遮罩文件使该层动画全部受到影响,这个方法效果更好

  • Blending:混合方式

    • Override:覆盖方式,播放该层动画时忽略其他层信息
    • Additive:叠加方式,会和其它层动画叠加播放
  • Sync:是否同步其它层
    主要用于直接从另一个层复制状态过来,在该层中进行修改
    适用于比如正常状态下有待机走路跑步等等动作,
    但是受伤状态下动作会改变,可以利用同步层方便我们进行编辑
    选择后会多一个Source Layer表示你要复制哪一层的状态

  • Timing:当选中Sync同步其它层时,该参数激活
    选中,会采用折中方案调整同步层上的动画时长(基于权重计算)
    不选中,动画时长将使用原始层做为母版

  • IK Pass:反向动力学通道,如果要该层动画受到IK影响就必须要开启之后讲解IK的时候再讲解

代码改变权重

注意!该API使用动画层级的索引作为参数,可以通过名字来获取索引

获取层级索引

1
animator.GetLayerIndex("MyLayer2")

第一个参数是层级的索引,第二个参数是修改为何种权重

1
animator.SetLayerWeight(animator.GetLayerIndex("MyLayer2"), 1f);