Animation 动画
0.前言
这个笔记用于讨论在Unity中开发游戏时使用动画的相关知识。
这个笔记最终期望能够达到:在Unity的Demo中展现一个人物,其能够进行类似挥拳、开门的具体动作。
我将这个任务进一步的划分:
第一阶段,获得动画资产,把现有的动画资产组织起来,能够配合输入编排状态机,从而实现操控游戏人物;
第二阶段,逆转思维,倒过来想办法从3D模型自己生产出动画资产
第三阶段,结合起来,最终实现从模型到自设计动作到状态机控制最后组成一个打拳Demo。
0.1 用UAS搜集资产
为了搜集一些资产,我首先尝试了解了Unity Asset Store。
UAS提供了大量的免费素材,能够支持游戏从出生到入土的各个阶段。
在3D/角色 栏目下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ix0sIDZF-1659097817538)
我选择了其中的那个picochan,并且添加至我的资源。在Unity-Window-PackageManager当中能够找到这个资源项,点击Download开始下载。下载完成后import。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uqy8ferw-1659097817539)
引入后,在Assets/Picola/PicoChan/Prefabs当中可以找到一个当前人物的预制件。拖进场景,就能看到那个Chan小姐姐了。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-djzFV6oq-1659097817539)
问题:我们获得的这个文件,到底是什么东西?
Picochan文件夹下,有Materials,Models,Prefabs,Samples,Textures几个文件夹。平级的Toon文件夹下还有Editor和Shader两个文件夹。
无疑这是一个3D模型。这距离我们的动画剪辑还是有差别的。
我的理解是,3D模型是一些定义好了上色方法的网格(三角形)。这个模型是静态的,并不是动画。3D模型一般用3DMAX,Maya,Blender等软件生产。
为了理解动画剪辑这一动画中最基础的概念,我们可以跳过从模型生产出动画剪辑这个核心步骤,直接来看一看拿到手的动画资产长什么样。
我获取了另一个资产,风格和上面的二次元小姐姐比较接近,但是一个动画资产:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FZNsDltd-1659097817540)
这里可以看到,作为动画资产里面的东西就多得多了,目录结构也会变得复杂。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9qFJLiil-1659097817540)
首先,找到Prefabs当中的预制件,是和上面3D模型一样的静态人物。然而在Art/Animation/SD_Unity_Chan/Generic当中,则是一些名字很长的文件,其中一个名为Unity_Chan_G_Idle_01,打开文件管理器才看到带上后缀全名为Unity_Chan_G_Idle_01.FBX
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
后面我们也会聊究竟FBX存储了怎么样的数据。
在Inspector-Model-Select 点击Select后选择Animation,表示使用Inspector的动画管理功能。直接单击FBX文件本身,Inspector也会直接变成模型导入设置窗口Model Input Settings Window,四选一即Model Tab模型选项卡,Rig Tab(定义 Unity 如何在导入的模型中将变形器deformers映射到网格Mesh),Animation Tab动画选项卡以及 Material Tab材质选项卡。我们稍后在1.1详细来谈Animation Tab.
0.2 动起来!
这一段是写到中途的时候才到回来写的。我终于把现有的资产运用起来,让模型动起来了。
首先,把Art/Meshes/SD_Unity_Chan/Unity_Chan_humanoid 拖入Hierarchy.其实这个对象在Project里只是一个import设置项,告诉了Unity引入场景后如何配置。这是上面所说的3D模型,并不具有动画属性
然后,随便在Project一个位置创建一个Animator Controller。打开这个Animator,添加一个新状态:IDLE。
选中IDLE,在Inspector当中的Motion属性选择Clips。由于我们引入了三个动作,他们各自都有一个Clip。选择名为Unity_Chan_G_Idle_01的Clip。
最后,把这个Animator Controller拖动到Hierarchy里的Unity_Chan_G_Idle_01对象上。
下面有点失真的画面里,小女孩就动起来了。
同样的做法,我们可以把这批资产里的三个动画全都在Game Play里展现出来(请想象她们是运动的):
可以归纳import的动画资产的使用方法:
- 对模型绑定AnimatorController
- 在AnimatorController中编排好状态机
- 在状态机中各状态上绑上Animation Clips动画剪辑
1.动画剪辑
动画剪辑Animation Clips是动画的核心元素,而Unity当中的大多数动画资产并不是在Unity中直接创建的。他们可能来自于:
- 在动作捕捉工作室中捕捉的人形动画
- 美术师在外部 3D 应用程序(如 Autodesk® 3ds Max® 或 Autodesk® Maya®)中从头开始创建的动画
- 来自第三方库(例如 Unity 的 Asset Store)的动画集
- 从导入的单个时间轴剪切的多个剪辑。
动画剪辑是什么样子的,我们这就来找一些具体的例子来看。
1.1 Inspector-Animation Tab
可以看到Animation Tab里有非常多的数据,这对应了Unity官方文档-Animation Tab的对于Animation Tab 动画选项卡的介绍。
Animation Tab有四段部件。
A) Asset-specific properties
Asset-specific properties 资产特有的属性表
B) Clip Selection List
Clip Selection List 动画剪辑选单
在这个选单中,列出了所有的Clips(动画剪辑 Animation Clips)。选中其中一条,C窗口将会详细展示这个Clip的信息。可以添加或删除Clips。
C) Clip-specific properties
Clip-specific properties 剪辑特有属性表
注意,点击Generic文件夹中的对象,显示部分如下:
这与文档中的C部分不太一样。我们选择Humanoid当中的同名对象,就会是这样的内容:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MFuNEJLe-1659097817543)(./markdown_pic/uniani-11.jpg)]
我们最终会介绍这是为什么。
D) 动画预览
我们直接点击三角播放键,可以看到这个Clip是一个呼吸微动的动作。
选到Humanoid里的Run对象,播放出来就是跑步的样子。三个对象分别是静息、跑步和跳跃,有了这些数据我们其实能比较轻易地做出一个走路模拟器的Demo。
但是纵使动画是完整的,把这个资产丢到Hierarchy的主场景里运行游戏也并不能看到人物对应的运动。
对于各个属性,详见上面的官方文档网址。
1.2 动画剪辑的使用
Unity Doc Animation Controller
1.2.1 Animator Controller布局
Animator的左侧是Layers布局与Parameters布局,右侧是网格布局。
可以右键单击该网格以创建新的状态节点。使用鼠标中键或按住 Alt/Option 键拖拽可平移视图。通过单击可选择状态节点以进行编辑,而通过单击并拖动状态节点可重新排列状态机的布局。
左侧面板切换到 Layers 视图时,您可以在 Animator Controller 中创建、查看和编辑层。因此,可在单个动画控制器中同时运行多个动画层,每个动画层由一个单独状态机控制。此情况的常见用途是在控制角色一般运动动画的基础层之上设置一个单独层来播放上身动画。
中央的BaseLayer其实是一个路径,显示了当前状态机内的“示踪导航”分层位置。状态可包含子状态和树,这些结构可以反复嵌套。当进入子状态时,此处会列出父状态的层级视图以及当前查看的状态。单击父状态可跳回到父状态或直接返回到状态机的基础层。
如下图,通过Create Sub-State Machine创建了New StateMachine,而由于我们在BaseLayer的布局下创建了这个子状态,其被认定为BaseLayer的子状态。
Parameter布局里,可以为Animator Controller添加参数。这些参数被称为Animation Parameter动画参数,C#脚本能够访问这些变量,并向它们赋值。这是脚本控制和影响状态机流程的方法。