导读

大家是不是觉得 VR 中的动画特别神奇,其实它是基于 Unity 中的动画系统 Mecanim 实现的,Unity 在 5.0 之后,Mecanim 动画控制越来越强大好用,小白甚至可以在稍微看下 demo 后,就可以构建自己的动画需求。本篇介绍通过 Mecanim 构建动画的整体流程,通过实例,对构建的各个部分进行介绍,其中穿插作者对部分参数或设置的理解。

好了,咱们愉快的开始吧。

文章中会涉及到一些常用术语,大家可以在 “术语列表” 中查看,其中涉及的主要术语有:

视频片段 Animation Clip

阿凡达 Avatar

重定向 Retargeting

绑定 Rigging

蒙皮 skinning

动画组件 Animator Component

动画控制器 Animator Controller

动画层 Animation Layer

动画状态机 Animation State Machine

动画参数 Animation Parameters

大家不用特意记忆这些术语,随着对动画系统的深入,许多术语自然就记住了。

动画基础内容

动画系统创建流程

⊙导入动画资源:导入外部动画资源或者 unity 创建的动画资源(这些动画资源保存在 fbx 格式文件中)。

⊙创建动画控制器:创建动画控制器,控制动作(通过状态机控制动画之间的切换)。

⊙导入外部人物模型:外部模型导入后和 unity 内部骨骼肌肉映射,之后生成 avatar。

⊙资源关联:在动画组件中,关联动画控制器和 avatar。

一、导入动画资源

此处的动画资源,是指动画片段,即 animation chip,它一般包含在模型资源,即在 fbx 文件中。

Unity 支持从外部导入和内部创建(或修改外部动画资源)两种方式导入动画资源,内部创建暂时不讲 - 较复杂,留待后续补充。

1.1unity 支持模型格式

Unity 大部分动画资源都是在外部 3D 软件上创建的如 3DMax,Maya 等,支持的几种模型格式为 fbx,obj,max,mb,blend,fbx 为 3D 模型的通用格式,也是 Unity 建议使用的格式。

1.2Fbx 文件内容

以下是一个导入的 fbx 动画资源的内容(包括骨骼结构,动画片段,动画 avatar 文件)

Ps:有的模型也会有网格 mesh 文件(后面会介绍到);有的不需要动画 avatar 文件(此时模型的 avatarDefinition 参数要设置为从外部获取 avatar)。

1.3 导入方式
导入方式很灵活,可以通过 unitypackage 一块导入多个 fbx 到 asset 目录下,可以直接把 fbx 文件复制粘贴到 asset 的目录下。

1.4 资源获取
可以在 assetstore 中下载一些免费的动画资源,比如搜索 defaultavatar,其中的 Raw Mocap Data for Mecanim 包括了很多基础的动画,用的同学可以下载下来:

当然,如果想要更好的一些资源,还是需要一些银子找些付费资源的。

让我们导入一些动画资源吧
现在,你已经可以导入构建自己的动画所需要的一些动画资源了。比如:idle(空闲状态的动画),walk(走动的动画),run(跑动的动画)。

小结:本部分,大家知道通过导入 fbx 文件,可以导入一些动画资源,这些动画资源是我们用来实现动画系统的重要组成部分。

二、创建动画控制器

动画控制器是个啥捏?通俗的讲,动画控制器就是把你的动画资源连接起来,你可以通过它控制系统什么时候(什么条件)播放你想要的动画(如:走,跑,跳等);他是一个单独的.controller 文件,可以在 asset 中右键创建此文件 Create》animation controller;他通过一个或多个状态机去控制动画之间的各种切换。

那我们来创建一个动画控制器吧

2.1 创建一个 control 文件

2.2 双击打开动画控制器文件

初始的动画控制器由以上部分组成:1)Layers,动画层级,控制动画叠加,比如我们熟悉的 CS 中的角色动画,可以由上下两层组成,上层控制打枪动画,下层控制运动(走,跑,跳等)的动;Parameters,控制状态之间的切换,当参数满足某条件时,由一个状态跳转到另一个状态;它由四种类型 float,bool,int,trigger 组成。

2)初始创建会生成一个基础层。

3)在基础层中,anystate,代表任何状态;用法:比如,你想实现在任何状态下,按某个按键 Key,都会跳转到特定状态,就可以使用它。

4)入口和出口,在状态机做为子状态机时,会用到;在使用 anystate 时一般也会用到这里的出口。

2.3 动画添加到状态机中

通过拖动的方式,把之前添加的动画资源拖入到状态机中

1)你会发现拖入的第一个动画片段显示为黄色,并且有一条线从 Entry 连接到这个状态,这是什么捏?系统会把第一个拖动进入的动画片段设置为默认状态,就是动画播放时的初始状态,你可以通过在各状态上右键对默认状态进行修改。

2)是非默认状态,显示为灰色 3)你可以在这里修改各状态的名称 4)为状态机添加 transition(状态转换)

可以通过在状态机上右键 “Make transition” 添加,以下为添加好状态转换及对状态修改名字后的状态机(可以从 idle 状态过度到 walk 状态,从 walk 状态过度到 run 状态,这很好理解,你总不能从站立状态直接达到跑的状态吧)

2.4 添加参数
细心的同学应该发现,“哎,状态之间满足什么条件之后可以跳转到下一个状态捏,这里马上就讲!” 下面为我们的状态机添加转换条件

1)点击 parameter 层,为状态机添加一个 speed 参数,默认参数值为 0.0 这个初始值可以自己设定,你想让你的初始状态是哪一个,就把 speed 值设置到触发他的状态上。

2)点击一个 transition,可以在右侧看到相关参数设定,点击右侧标记的 + 号处,添加一个转换条件(当 speed 大于 0.1 时,转换到 walk 状态,这里可以根据实际效果进行调整)

3)同样的为其他状态添加状态转换条件,最后实现是:当 speed 大于 0.5 时进入到 walk 状态,大于 0.8 时进入 run 状态,小于 0.8 时,进入 walk 状态,小于 0.1 时进入 idle 状态。

Ps:上面有个 has exit time 参数,如果勾选,当满足某条件需要跳转时并不会马上跳转,只能等到当前正播放动画播放完之后,才可以跳转;不勾选,则直接可以跳转。

好了,一个简单的动画控制器就创建完成了,后面我们可以用他来控制动画了。

小结:动画控制器是由状态机构成的,可以把动画片段拖动到状态机中,做为状态机中的各种状态,通过为各种状态添加 transition 控制状态间的切换方向,通过为 transition 添加参数,控制状态转换的条件。

三、导入外部人物模型

现在,是不是迫不及待的想把自己从网上下载的模型放到自己场景中了,让我们慢慢来。

下面这个资源是我在网上下载的一个动画模型 fbx 文件

大家有没有发现,相比第一部分导入的动画资源,多了什么东西?少了什么东西?

多的东西:相对之前导入的动画资源,多了一些 Materials 材质,多了一些贴图,fbx 文件内多了一些 mesh 文件(这些多出来的东西就是针对每个模型特有的皮肤,好比张三和李四,内部的骨骼大概都是一样的,当然也可能不一样,但是外部的皮肤肯定是不一样的)

少了东西:少了 avatar 文件

这个少的 avatar 文件就是导入模型内的骨骼和系统内部骨骼系统匹配后生成的文件。

下面我们来生成一下 avatar 资源。

3.1 选择中 u_character_REF 文件

在右边的 inspector 中可以看到对应参数

3.2 设置 Model 部分
我们只关注以下参数即可

Scale Factor 模型缩放 这里理论上都应该是 1,也就是模型的原大小。但也有可能是 0.1 或者 10 之类的,跟你 3DMax 的单位设置有关,无论是几都可以,只要跟其他模型是统一的就 OK(技巧,可以把模型拖到场景中,同时拖入一个 3D cube,一般 cube 默认边长为 1m,对比一下来调整模型的此处的参数)。

Mesh Compression 网格压缩,用来降低模型的面数,这个一般都是选择关闭的,如果程序说,我们模型的面数太高了,要在这里进行压缩,揍他,然后叫做模型的同学想办法在 3DMax 里降低面数。

3.3 设置 Rig 部分

Animation type 选择 Humanoid(人型),我们导入的模型是人型。

Avatar Definition 此处可以选择从自己或从外部引用,此处是为了生成自己的 avatar,所以选择从自己生成。

Configure 点击可以对模型骨骼肌肉进行配置,配置 ok,点击 done 后,这里会出现对勾,如果匹配不成功,会出现 X,这时需要手动调整。

Optimize Game Object:简单点说,项目发布前,把这一项勾上。When turned on, the game object transform hierarchy of the imported character will be removed and stored in the Avatar and Animator component. The SkinnedMeshRenderers of the character will then directly use the Mecanim internal skeleton. This option improves the performance of the animated characters.You should turn it on for the final product. In optimized mode skinned mesh matrix extraction is also multithreaded.

这里进行骨骼映射,比较省力的方法是,直接 apply,系统会自动把模型的骨骼肌肉和 unity 内部的肌肉映射,然后点击 configure 查看映射关系,如果有问题,再进行调整。

好了,我们已经点击了 apply,configure 这里也显示了对钩,如上,这时我们观察一下之前导入的模型文件,生成了一个 avatar 文件

3.4 设置 Animation 部分


我们导入的模型资源中是没有 animationchip 的,所以不用对其进行编辑。

小结:一般导入的动画资源,有 Materials 材质,有贴图,fbx 文件内有 mesh 文件,才能把动画资源拖动到 scene 中(毕竟场景中的动画,怎么也要有皮吧);在 Rig 部分点击 apply 后,要到 configure 中进行检查,关联映射是否正常;

四、资源关联

来,我们掰手指算一下,我们导入了动画资源,做了动画控制器,生成了 avatar;我们做了这么多东西,现在可以在场景中添加动画了吧;好的,让我们在场景中添加模型,增加动画吧,我们还是一步一步来:

4.1 第一步
我们把已经添加的模型 U_Character_REF 拖入到 Hierarchy 中,在 Hierarchy 中点击它,可以发现,模型中自带了一个 Animator 组建,如果没有也没关系,我们可以自己添加

4.2 第二步
进行关联,如下图,把之前创建的动画控制文件和 avatar 文件关联到下面两个位置

注意,这里的 Apply RootMotion 要勾选上,如果不勾选,动画自身发生的位置变化不会应用到场景中。好了,添加完这些之后,我们可以点击运行,天啊,动画没有动!为什么?为什么呢?好像我们忘记控制动画状之中的参数变化了

4.3 第三步
添加脚本我们来创建一个脚本,脚本内容如下:

1.获取动画组件

2 通过方向键控制速度大小

3 通过 SetFloat 设置 动画参数 speed 的大小,来实现控制动画状态机间的状态切换。

就是这么简单,添加完脚本之后,我们再运行下,神奇的事情发生了,我们的动画动起来了!哈哈。

小结:通过把 avatar 和动画控制器关联,来实现动画系统的重定向,大家可以想一下:假如我们有一个新角色新模型添加,我们只需要让这个模型和 unity 内部的骨骼进行关联生成 avatar,然后把已经做好的动画控制器连同这个 avatar 一块用到模型上,就实现了动画控制的复用,多神奇的事情!

五、调整动画

上面的工作做完之后,我们可能会发现我们的动画运行的并不是那么好:比如,跑动的腿怎么是一边的,好像瘸了一样;动画为什么是陷到地面以下的;按上下键控制速度时,怎么这么慢啊,等等。。。

我想告诉大家的是,我们还远没有做完,我们还需要对动画参数进行调节,对代码中的逻辑设置进行调节,对动画切片中的动画进行整,这部分笔者暂时先不写了,以后会在后续文章上逐步对动画系统 Mecanim 的各部分进行讲解,大家记住,上面的工作做完后,还需要进行进一步调整。

术语列表
Animation Clip 视频片段:通常存在于 fbx 的文件中,也可以单独存在。用来构建动画状态机中的每个状态,我们也可以通过 Unity 内置的

Animation 插件对动画片段进行编辑。

Animation Curves 动画曲线:我们可以通过把曲线附加到动画片段上,通过曲线上对应的数值控制动画片段所对应的对象的某些参数,最终达到控制动画片段的效果。举个例子,有一个向前跳跃的动画,要穿过一堵墙上的小孔,我们可以这么实现:先为这个动画片段加入动画曲线;然后,在动画跳跃起来后,设置动画的碰撞体大小为很小或 0;最后,在穿墙过后,或者说动画播放过后,碰撞体大小再进行恢复。

Avatar Maskavatar 蒙板:在动画状态机中用于不同的层进行动画合成,控制显示或不显示动画模型的某些部分(如,我可以设计只显示手臂)。

Avatar 阿凡达:主要用于动画重定向 retargeting,从一个骨架重定向到另外一个骨架(外部导入的模型最开始没有 avatar,通过和 unity 内部骨架和肌肉关联,通过 configuration 生成)。

Retargeting 重定向:把为一个模型创建的动画应用到另外一个模型(一般在 animator 的组件中通过设置 avatar 和设置动画控制器实现)。

Rigging 绑定:为你的网格建立一个骨架的层次结构和关节的过程(这里指的是导入模型的内部层次结构,这些层次结构在外部如 3Dmax 中指定)。

skinning 蒙皮:把骨骼关节绑定到角色网格或者 “皮肤” 的过程(这里指的是导入模型的外部皮肤,这些皮肤在外部如 3Dmax 中指定)。

Muscle Definition 肌肉定义:它允许你更直接地控制 Avatar。当一个 Avatar 准备好了之后,Mecanim 工作在肌肉空间,这比骨骼空间更直接。(在导入模型后,可以在 muscle tab 中定义各肌肉模块的控制范围)。

T-pose T 姿势:角色双臂平伸,形成一个 “T” 字的姿势。一般角色保持这个姿势更容易观察 Avatar。

Bind-pose 绑定姿势:the pose at which the character was modelled 建模过程中的姿势

Human template 人型模板:一个预先定义的骨骼映射(用于从 fbx 文件中匹配骨骼到 Avatar)

Animator Component 动画组件:在模型上使用 Mecanim 动画系统的组件(这个组件通过 Animator Controller 资源和 avatar 对动画进行重定向)

Root Motion 根运动:角色根级动作,它可以被动画本身或者外部控制(可以理解为每个 animation clip 预览中下面的圆圈圈)

Animator Controller 动画控制器:一个状态机,控制动画的状态转换。

Animation Layer 动画层:每个层包含一个控制动画的状态机。例如我们可以创建 “基础层” 控制走路、跑动;创建更高的层控制上半身动作比如投掷、跳跃(更高层对于身体部位有更高的控制权)。

Animation State Machine 动画状态机:一个控制动画状态之间交互的图。每个状态引用一个混合树或者单一动画剪辑。

Animation Blend Tree 动画混合树:基于浮点动画参数(代码中可以通过控制浮点参数实现控制具体动画执行的目的),用于连续在多个近似的动画剪辑之间进行混合。

Animation Parameters 动画参数:用于在脚本和 Animator Controller 之间通信。一些参数可以在脚本中设定并且在控制器中被引用;另一些参数是基于在动画剪辑中的自定义曲线,这些参数,可以使用脚本接口来采样。(参数分为 bool,int,float 和 tigger 型)。

Inverse Kinematics (IK) 反向动力学:用世界中各种对象来控制角色身体部分运动(子对象控制父对象运动)

以下是官网的解释:

http://docs.unity3d.com/Manual/AnimationGlossary.html

原文链接:http://tmq.qq.com/2016/12/30248/

关注我们的微信公众号查看完整内容哦~~~~

想知道更多测试相关干货
请关注我们的微信公众号:腾讯移动品质中心 TMQ
二维码:
这里写图片描述

版权声明:腾讯 TMQ 拥有内容的全部版权,任何人或单位对本贴内容进行复制、转载时请申明原创腾讯 tmq,否则将追究法律责任。


↙↙↙阅读原文可查看相关链接,并与作者交流