咨询电话:400-810-1418服务与监督电话:400-810-1418转接2

Unity动画系统设计介绍(上)

发布时间:2021-04-28 09:48:27

Hello,大家好,今天给大家分享一篇干货,Unity动画系统设计介绍(上),感兴趣的朋友可以一起来看下!

这两年和几个朋友一起讨论Unity动画系统,包括折腾了几次相关的组内分享,总结出很多内容。主要是关于设计和对象方面,陈列一下。

一、动画系统

1、简介

Unity现存两套动画系统:Legacy动画系统和Mecanim动画系统。Legacy动画系统功能相对简单,核心组件Animation;Mecanim动画系统是Unity当前主要的动画系统,在Legacy动画系统上增加很多新的概念,功能相对复杂,核心组件Animator。

2、动画曲线(AnimationCurve)

Unity中的AnimationCurve是一根二维曲线,在动画文件中曲线根据作用被分成了不同类型类型,具体分类可用下图表示:

不同类型BindCurve在Animation窗口内有不同的图标,图标由Curve绑定的组件来决定,Curve前显示的图标表示其控制的内容归属组件,其中最需要关注的是TransformCurve和MuscleCurve,前者图标是Transform的图标,后者图标是Animator的图标,属于Mecanim机制的Generic和Humanoid动画片在运行时是不会保留原始动画曲线数据的(在编辑器下会)。

所以运行期不能在Legacy机制下采样播放(但编辑器下可以),RootMotionCurve是程序内部生成的对象,它的特殊之处在于储存的值是相对整个模型空间的变换,而不是相对父节点的局部变换。

0.png

二、动画资产

1、资产的导入

Unity会对支持的文件执行导入流程,实际在引擎中出现的文件是导入流程生成的Unity对象。Unity导入模型和动画文件之后提供了很多的设置,导入设置面板中Rig和Animation选项页大部分都与动画相关。

最重要的选项是Rig/Animation Type,除无动画的None以外有三个选项,分别代表:

Legacy – 模型和动画数据都会被处理为Legacy系统的动画数据;

Generic – 模型和动画数据都会被处理为Mecanim系统的非人形动画数据,需要配置或者自动为模型资产创建对应的Avatar实例;

Humanoid – 模型和动画数据都会被处理为Mecanim系统的人形动画数据,需要配置或者自动生成模型骨骼创建Avatar实例和Human实例。

2、动画片段(AnimationClip)

动画片段是AnimationClip类型的对象,.anim资产文件,是Unity中动画数据的存在形式,AnimationClip数据实际上就是以绑定对象为索引的AnimationCurve数据集合。

所有的动画Fbx文件导入后都是生成AnimationClip类型的对象,只是资源管理器里的文件后缀名并不是.anim,且在引擎内禁止修改。导入的动画片段拷贝副本后,可以进行曲线修改和删除,导入DCC文件会根据关键帧拟合得到动画曲线,Unity有三种曲线拟合方式,埃尔米特曲线拟合、线性拟合和离散值。

默认情况下都是埃尔米特曲线拟合,也就是根据关键帧拟合出三次曲线,但如果导入动画资产时开启了动画压缩,则根据误差设置,Unity会自动在误差允许内使用线性拟合乃至保留离散的关键帧。

Unity不会在导入流程中使用离散值拟合,所以DCC软件里做的数值离散动画在Unity内播放会出现不合理的插值帧。

1.webp.jpg

3、动画的控制器

Mecanim的动画播放控制是由有限状态机和动画层级来完成,由Animator Controller做有限状态机层级的容器,Animator需要指定Animator Controller;

Animator Controller只能在编辑环境配置,运行期不可改,Animator Controller可以设置黑板参数(逻辑容器),可以在脚本中获取,也可以作为转移条件;如果黑板参数名字与播放的Custom Curve相同,则伴随动画播放动态修改。

Animator Controller核心概念就是Layer,State和Transition,就是层级,状态,转移,一个状态可以是播放一个动画片段的节点、一个子状态机或者混合树,Layer之间可以进行动画覆盖与附加,输出可以使用Avatar Mask进行剔除。

Sync选项可以让多个层级使用一个状态机,但是每个状态上可以播放不同的动画,Mecanim的IK也是以层级为单位。

State可以进行一些播放状态的设置,Mecanim的动画混合是使用BlendTree完成的,BlendTree可以作为一种State存在,Unity的BlendTree没有什么特殊设置。

Foot IK选项不意味着开启足部IK,而是启用足部IK相关的一些前处理,主要有两个:启用Human设置中的Feet Spacing,确保双足骨骼在Z轴上差距2倍Feet Spacing;根据Root Motion得到的速度进一步修正双足骨骼的位置。

Transition控制State之间的转移,主要依赖条件有两个,退出时间Exit Time以及参数条件Condition,两者均满足才会发生转移,转移有Solo和Mute标签,前者表示优先转移,后者表示禁用。

Animator Controller的动画融合是在转移的时候完成的;

可以在编辑器里配置转移打断相关的设置。

2.png

4、Avatar

Avatar文件是Mecanim方案里负责记录模型骨骼层级结构相关的数据合集,也会储存重定向方案相关的数据;

DCC文件导入时会生成或者依赖一个确定的Avatar文件完成动画数据的导入流程;

Animator组件可以通过指定Avatar文件完成骨骼层级结构的初始化,但也可以通过配合动画控制器查询当前模型子节点获取,所以Avatar文件并不是必须的。

来源:知乎

作者:Yene