Unity-Animation

Unity-Animation

Editor

  1. 动画片段集(Animation Clips)

    动画数据被存放在动画片段集中,如人物的跑动、跳跃,路灯的亮度变化等数据。动画片段集分为两个部分:

    • Values:某个属性的值

    • Bindings:该动画片段集绑定的对象物体的属性,如位置,旋转,光照强度等

      image-20210628231944021

  2. 编辑窗口

    注:动画只有附着在一个具体的游戏对象上(该动画有上下文)才可以被编辑关键帧

    • 改变时间线显示单位:可调整为秒单位或帧单位,如下图展开菜单栏的前两项

      img

    • 显示帧数:需要先勾选Show Sample Rate(如上图),表示1秒内显示多少帧,如下图Samples的位置

      image-20210628235432991

    • 预览模式(Preview Mode):

      image-20210629000628052

      该模式下,时间线和属性会蓝色高亮,该模式用于编辑关键帧

    • 记录模式(Record Mode):

      image-20210629000708338

      进入模式后,时间线会变红,在该模式下添加的任何绑定、关键帧、曲线的修改都会被记录到动画中,可用于自行添加关键帧

    • 切换Animation Clips:

      img

      可以在当前的Animator中新建Clip,也可以切换到已存在的一个Clips上编辑

    • 筛选动画曲线:

      点击下图中的按钮后,左栏只会显示游戏对象中存在的绑定

      img

    • 添加关键帧和事件:

      img

      在选定的帧点击创建事件按钮后,就可以设置动画事件,如果该动画具有上下文,则直接选择脚本中的函数

    • Dopesheet Mode:

      只会显示绑定量在某个时间结点是否有关键帧

    • Curves Mode:

      能够显示每一帧的属性值

      曲线编辑模式如下图:

      img

      • Clamped Auto:平滑接近关键帧
      • Free Smooth: 自由编辑曲线
        • Flat: 曲线的切线时水平的
      • Broken: 左右的切线不平行
        • Free:自由编辑
        • Linear:相邻关键帧用直线连接
        • Constant:保持前一个关键帧的值不变,直到下一个关键帧发生突变,图像类似于脉冲信号
      • Weighted:可以控制曲线的长度
    • Ripple Editting:

      img

      勾选后,关键帧的移动能够带动后面的关键帧移动

      勾选前:

      image-20210629004016725

      勾选后:

      image-20210629004040728

      移动黄色区域后:

      image-20210629004103401

      曲线模式同样能够整块编辑

      image-20210629004212816

  3. 动画转换(Animation Transaction)

    image-20210628232857756

    • Has Exit Time: 当前动画只有播放到指定的时间后才能退出,可用于动画的流畅衔接
    • Exit Time: 退出时间和动画完成时间的比例
    • Fixed Duration: 选中时以秒来计算转换持续时间,否则按帧计算
    • Transition Duration: 转换持续时间
    • Transition Offset: 下一个动画从哪个位置开始播放,即图中1:00开始经过30s的位置
    • Interruption Source: 能够被某个动画打断转换,例如该值设置为Current State,代表动画转换时,如果当前动画被播放,则可以打断转换,并且被打断后从头开始播放动画
    • Ordered Interruption: 打断是否有先后顺序

Animator

动画系统的整体结构如下:

动画参数:

  • Floats
  • Integers
  • Booleans
  • Triggers

Animation Blending

动画混合,指的是对于某个属性值而言,其最终值是多个动画的加权平均数

混合树(Blending Tree)

类型:

  • 1D:可以通过一个参数来混合多个动画
  • 2D Simple Directional:2个参数控制动画,但每个轴上只有2个动画
  • 2D Freeform Directional:每个方向可以有多个动画
  • 2D Freeform Cartesian:参数可以代表不同的概念,不仅仅是PosX和PosY
  • Direct:每个动画通过一个参数直接调节,多个动画可以叠加

对于每个Motion,有下列参数需要注意:

image-20210629092513734

临界值(threhold):该动画达到最大混合权重的位置,根据实际参数值到临界值的距离降低该动画的权重

时间范围设置(Time Scale setting):设置该动画的相对播放速度

混合树内也可以嵌套另一个混合树

State

每个动画机都需要管理若干个状态,状态所具有的属性如下:

  • Motion:设置状态的动画或者混合树

  • Speed:设置动画的播放速度

    可以通过代码来控制播放速度的大小,勾选Parameter,在Multiplier右栏填写参数名称

    img

  • Normalized Time:动画播放的相对时间,0表示开始播放,1表示播放结束

  • Motion Time:可以通过参数设置Normalized Time

  • Cycle Offset:设置动画循环开始的时间

Any State:能够从任何状态发出转换,并且该状态的转换是优先的

State Machine

可以像创建状态一样创建状态机

状态机的转换:

可以从状态机内部直接转换到状态机外部的某个状态,也可以先转换到状态机自身,再进行二次转换;状态机的转进同理

Layers

动画层索引(Animator Layer indices):动画层索引自顶向下递增,初值为0

动画层权重(Animator Layer weights):决定每个动画层的混合权重

蒙版(Masking):可以设置哪些游戏对象受到动画影响,例如可以只在人物的上半身设置攻击动画的模板

混合类型:

  • Override blending:类似于混合树混合,动画层之间的权重不可叠加
  • Additive blending:动画层的权重可以叠加

同步(Sync):当前动画层发生转换时,同步的动画层也发生转换,可以设置Timing选项调整权重(?)

Scripts

设置动画机的参数:

1
2
3
4
animator.SetBool();
animator.SetFloat();
animator.SetInteger();
animator.SetTrigger();

该函数有2个重载,第一个参数可以是字符串,也可以是该字符串的哈希值(调用Animator.StringToHash(str)转换,后者的性能更好

获取动画机的参数:

1
2
3
animator.GetBool();
animator.GetFloat();
animator.GetInteger();

控制动画层权重:

1
2
animator.SetLayerWeight();
animator.GetLayerWeight();

控制动画播放:

1
2
3
4
animator.Play(name, index of layer, offset);
animator.PlayInFixedTime(); // offset is based on seconds but not Normalized Time
animator.CrossFade(); // 添加渐变效果
animator.CrossFadeInFixedTime();

状态和动画片段的信息:

1
2
3
4
5
animator.IsTransition();                  // 判断状态是否在发生转换
animator.GetCurrentAnimatorStateInfo(); // 获得当前状态信息
animator.GetNextAnimatorStateInfo(); // 获得下一个状态信息
animator.GetCurrentAnimatorClipInfo(); // 获得当前动画片段信息,返回一个动画片段信息的数组,用于获取混合树及权重
animator.GetNextAnimatorClipInfo(); // 获得下一个动画片段信息

Unity-Animation
http://example.com/2023/01/10/Unity-Animation/
作者
Chen Shuwen
发布于
2023年1月10日
许可协议