Unity Mecanim动画系统

Unity Mecanim动画系统

Unity官方文档

Model Import Settings window中的Rig

alt

· Animation Type 动画类型
	None 没有动画
    Legacy 老式的,旧版动画
    Generic 通用的,需要确定根节点(Root node)
    Humanoid 类人的,
Avatar Defintion 选择获取Avatar
	Create from this model 从自身创建
    Copy from Other Avatar 复制其他的Avatar
    	Configure 配置:对Avatar进行配置
Skin Weights 蒙皮权重:设置可以影响单个顶点的最大骨骼数。
	Max Bones/Vertex 最大骨骼/顶点:设置每个顶点的最大骨骼数以影响给定的顶点。您可以为每个顶点设置 1 到 32 个骨骼,但用于影响顶点的骨骼数量越多,性能成本就越大。
	Max Bone Weight 最大骨骼重量:设置考虑骨骼权重的底部阈值。权重计算会忽略小于此值的任何内容,并且 Unity 会将高于此值的骨骼权重按比例放大至总计 1.0。

Model Import Settings window中的Animation

Asset-specific properties(特定的资产属性)

alt

这些设置定义了整个资产的导入选项。

· import Constraints 导入约束,约束组件链接游戏对象的位置、旋转或缩放到另一个游戏对象。受约束的 GameObject 像它所链接的 GameObject 一样移动、旋转或缩放。
· import Animation 导入动画,如果为disabled,其他选项都会隐藏
· Bake Animations 烘焙使用 IK 或模拟创建的动画以转发运动学关键帧。仅适用于 Autodesk® Maya®、Autodesk® 3ds Max® 和 Cinema 4D 文件。
· Anim.Compression 动画压缩类型
	 -off 不压缩,会产生高质量动画,但会降低性能
     -Keyframe Reduction 减少关键帧,减少导入时的冗余关键帧。仅适用于通用动画类型。
     -Keyframe Reduction and Compression 减少关键帧压缩,在文件中存储动画时,减少导入时的关键帧并压缩关键帧。仅适用于传统动画类型。
     -Optimal 最佳,让 Unity 决定如何压缩,通过减少关键帧或使用密集格式。仅适用于通用和人形动画类型。
·Animation Compression Errors 动画压缩错误
	- Rotation/Position/Scale Error 旋转/位置/缩放错误,设置旋转/位置/缩放曲线压缩的误差容限(以百分比形式)。 Unity 使用它来确定它是否可以删除旋转/位置/缩放曲线上的关键点。
·Animated Custom Properties 动画自定义属性,导入指定为自定义用户属性的任何 FBX 属性。Unity 在导入 FBX 文件时仅支持一小部分属性(例如平移、旋转、缩放和可见性)。
但是,可以通过extraUserProperties 成员在导入程序脚本中命名标准 FBX 属性,例如用户属性。

Clip-specific properties(特定于剪辑的属性)

alt

· Loop Time 循环时间 循环播放动画
	- Loop Pose 使循环动画更加自然,无缝循环。
    - Cycle Offset 周期偏移 如果在不同的时间开始。
· Root Transform Rotation/Position(Y)/Position(XZ)
- Bake Into Pose 将运动烘焙到骨骼的运动中。禁止存储为根运动
- Baked Upon 根运动的参照点
· Additive Reference Pose 附加参考姿势,启用以设置用作附加动画层基础的参考姿势的帧。时间线编辑器中会出现一个蓝色标记:
	- Pose Frame 输入要用作参考姿势的帧编号。您还可以拖动时间线中的蓝色标记来更新此值。
  • 在允许根运动的前提下以Root Transform Position (XZ)(根的水平移动)为例,Bake Into Pose勾选左图与不勾选右图的对比:

勾选:根(图中蓝点)不会随动画的运动而变化,始终位于同一位置。 不勾选:根(图中蓝点)会随动画的运动而变化。

alt

  • Curves 动画曲线

  • Event 动画事件 通过使用动画事件,可以在时间轴中的指定点调用对象脚本中的函数,函数名称与动画事件中的函数名称应当相同

· 访问修饰符必须为 Public
· 函数返回值为 void 
· 只有 一个输入参数 
· 输入参数类型包括: int float string Object 

alt

  • Mask 动画遮罩

使用Avatar Mask被遮罩部分不会播放动画

alt

· Definition 定义:如何创建Avatar Mask
	从自身模型创建
    从其他Avatar Mask中拷贝
    不创建
· Humanoid:通过从人形身体地图中选择
· Transform:通过在变换层次结构中选择哪些骨骼被包含或排除
  • Motion 改变根运动结点
  • Import Messages 动画导入信息,有关动画导入的相关信息。

Animator

此图显示了各种资产(Animation Clips, an Animator Controller和Avatar)是如何在游戏对象上的Animator组件中组合在一起的:

alt

Animator 组件

alt

· Controller 控制器: Animator Controller动画控制器组件
· Avatar :此角色的Avatar(如果Animator用于为人形角色制作动画)
· Apply Root Motion :允许根运动,使该物体以自身坐标为中心进行运动,使动画可以发生实际的位移;
也可以使用脚本中MonoBehaviour.OnAnimatorMove()方法进行控制,如果脚本中包含此方法选框就会变成Handled by Script
官方:选择使用动画自身还是通过脚本MonoBehaviour.OnAnimatorMove()控制角色的位置和旋转
· Update Mode 更新模式
	Normal 普通的:Animator 与 Update 调用同步更新,并且 Animator 的速度与当前时间相匹配。如果时间变慢,动画将变慢以匹配。
    Animate Physics 物理动画:Animator与 FixedUpdate 调用同步更新(即与物理系统同步更新)。如果使用物理交互为对象的运动设置动画,则应使用此模式,例如可以推动刚体的角色。
    UnScaled Time 未缩放时间:Animator与 Update 调用同步更新,但Animator的速度会忽略当前的时间,无论如何都以 100% 的速度进行动画播放。这对于以正常速度为 UI 系统设置动画时很有用,同时使用修改的时间刻度来获得特殊效果或暂停游戏
·Culling Mode 动画的剔除模式
	Always Animate 总是播放:始终动画,即使在屏幕外也不要进行剔除。
    Cull Update Transforms 根据位置更新剔除:当渲染器不可见时禁用重定向、IK 和位置的改变
    Cull Completely 完全剔除:当渲染器不可见时,动画被完全禁用。

Animator Controller动画控制器

不可以使用Ctrl+Z进行撤销操作,因为在Animator Controller动画控制器面板中是直接对文件进行的操作。 alt

Animator Controller 允许安排和维护一组动画剪辑Animation Clips和相关的动画过渡Animation Transitions用于角色或对象。

  • 是一个将动画(animation)整合起来的控制器
  • 利用了状态机的原理控制动画的播放

alt

  • 可以实现动画的播放转移融合以及分层播放等等
  • 可以使用脚本去控制,获得Animator内的状态

Animation Layers动画层级

Unity 使用动画层来管理复杂的状态机针对不同的身体部位。

alt

层级设置:

·Weight 权重:值越大,权重越高,该层级的动画片段播放顺序越靠前
·Mask 层级遮罩:AvatarMask组件;指定要应用动画的身体部位。
·Blending 混合类型:指定动画的应用方式。
	Override 覆盖:使用此图层上的动画,替换之前图层上的动画。
    Additive 添加:将此层上的动画添加到前一层的动画之上。此层必须包含与前一层相同的属性。
·Sync 同步:在不同层中重用相同的状态机,复制出一个相同的层;该层为所复制出的层的实例;也可以为该层指定新的动画片段。
	Timing:允许调整同步图层中每个动画所需的时间,由权重决定。若进行了时间长度的调整,或该层与复制层的动画片段时间长度不同,该层的动画播放速度会减慢或加快以匹配复制层的动画长度。
·IK Pass:勾选可以调用OnAnimatorIK方法;

Animation Parameters动画参数

alt

参数列表: 1.Float--一个浮点数

2.Int--一个整数

3.Bool--true 或 false 值(由复选框表示)

4.Trigger--一个布尔参数,当被转换消耗时由控制器重置(由圆形按钮表示)

Animation States动画状态

  • 是动画状态机的基本构建块

alt

每个状态都包含一个单独的动画序列(或混合树),该序列将在角色处于该状态时播放。当游戏中的事件触发状态转换时,角色将处于新状态,将播放新状态下的动画序列

· Motion 运动:这个状态的动画片段
· Speed 速度:动画的默认播放速度;启用参数以使用脚本中的自定义值修改速度。例如,您可以将速度乘以自定义值来减速或加速播放速度。
· Motion Time 运动时间:用于播放此状态的动作的时间。启用参数以使用脚本中的自定义值控制运动时间。
· Mirror 镜像:此属性仅适用于具有人形动画的状态。启用以镜像此状态的动画。启用参数可以利用脚本启用或禁用镜像
· Cycle Offset 周期偏移:添加到运动状态时间的偏移量。此偏移不会影响运动时间。启用参数以从脚本指定循环偏移。
· Foot IK 足部IK:此属性仅适用于具有人形动画的状态。启用以实现该状态的反向动力学。例实现人物上楼梯时双脚一直与地面接触。
· Write Defaults 写入默认值:AnimatorStates 是否为不是由其运动生成动画的属性写入默认值。 ??
· Transitions 过渡:此状态的转换列表。

Animation transitions动画转换

动画转换允许状态机从一种动画状态切换或混合到另一种动画状态。转换不仅定义了状态之间的混合需要多长时间,还定义了它们应该在什么条件下激活。

alt

· Has Exit Time 有无退出时间:退出时间是一种不依赖于参数的特殊转换。相反,它依赖于状态的标准化时间。检查以在退出时间(Exit Time)中指定的特定时间进行转换。
· Setting 设置:包含详细过渡设置的折叠菜单。
· Exit Time 退出时间:如果选中了 Has Exit Time,则该值表示转换可以生效的确切时间。以标准化时间表示(例如,退出时间为 0.75 意味着在播放了 75% 动画的第一帧上,退出时间条件为真)。在下一帧,条件为假。
· Fixed Duration 固定期限:如果选中“固定持续时间”框,则转换时间(Transition Duration)解释为以秒为单位。如果未选中“固定持续时间”框,则将转换时间(Transition Duration)解释为源状态归一化时间的一小部分(%)。
· Transition Duration 转换持续时间:转换的持续时间,以标准化时间或秒为单位,取决于固定持续时间模式,相对于当前状态的持续时间。
· Transition Offset 转换偏移:在转换到的目标状态下开始播放的动画序列的时间偏移量。
· Interruption Source 中断源:使用它来控制此转换可能被中断的情况
· Ordered Interruption 有序中断:确定当前转换是否可以被独立于其顺序的其他转换中断
· Conditions 转换条件:转换可以具有单个条件、多个条件或根本没有条件。如果没有转换条件Unity编译器会利用退出时间,如果有多个则必须满足所有条件,并且满足退出时间。
Transition interruption中断转换

使用Interruption Source(中断源)和Ordered Interruption(有序中断)属性去控制如何中断转换。

中断的工作原理:转换被排队,然后解析从插入的第一个转换到插入的最后一个转换的有效转换。The interruption order works, conceptually, as if transitions are queued and then parsed for a valid transition from the first transition inserted to the last. Interruption Source(中断源)和Ordered Interruption(有序中断)

Transitions between Blend Tree states混合树之间的状态转换

混合树之间的状态转换

Animator Controller窗口中组件

  • State单一动画
  • Sub State Machine动画组
  • Blend Tree动画融合组混合树

alt

Humanoid Avatars 人形Avatars

Humanoid Avatars

State Machine Behaviours 状态机行为脚本

状态机行为是个可以添加状态机状态的组件。 状态机行为脚本

alt

应用于Animator整个控制器;对所有的状态都有效,若应用于其中一种状态则只对当前状态有效。

反向动力学

例:手带动手臂运动,当拿水杯时