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);