Unity动画系统支持引擎内编辑动画,也支持外部导入FBX动画。引擎内置的动画编辑器没有骨骼动画的概念,只能编辑每一帧模型的Transform信息。可以在外部3D类软件编辑动画并导出fbx,来让Unity使用。(FBX (Filmbox) 是自 2006 年以来由 Kaydara 开发并归 Autodesk 所有的专有文件格式 (.fbx)。它用于提供数字内容创建应用程序之间的互操作性。)

Unity支持FBX网格文件的优化,动画重定向等功能。由于每个模型可能有很多动画,这样它们的管理就比较复杂。Unity提供了Animator组件,它是可视化的状态机编辑工具,可以更方便地预览自身动画之间的切换关系,以及动画混合方式。游戏中可能同时会有跟多模型,Unity又提供了TimeLine编辑工具,它用时间线来管理模型的进度关系,像游戏中常用的过场动画,技能编辑器或者3D动画片等。

模型

Unity显示模型必须给游戏对象提供Mesh Filter和Mesh Renderer组件。Mesh Filter表示模型基础的mesh数据,Mesh Renderer通过材质贴图和Shader最终将模型渲染出来。

Mesh Filter

Mesh Filter需要绑定一个Mesh资源,它记录的就是模型的顶点信息。如果是外部导入Unity的FBX文件,它会自动生成Mesh信息,但是这个信息只能是只读的无法二次修改它。可以读取原始FBX的Mesh信息,重新生成一个Mesh资源,这样就可以读写它了

FBX导入以后,将Material Creation Mode设为None,否则会自动生成3D软件中配置的材质文件。即使在Project视图中删除了它,改资源每次导入时,又会自动生成材质,多余的材质会影响到AssetBundle打包的依赖关系。

Mesh Renderer

Mesh Renderer需要一个材质,在材质上面可以设置贴图以及Shader。它还可以设置灯光阴影的接收信息以及烘焙的参数

Mesh Renderer

Prefab

游戏场景中需要很多模型,如果想批量给某一类模型添加或修改一些参数,就需要Prefab。因为修改Prefab之后,场景中所有引用Prefab的地方都会跟着修改。

将Hierarchy窗口中的对象直接拖入Project视图即可生成Prefab。Unity已经支持Prefab的嵌套。

在Hierarchy中引用的Prefab,可以单独设置参数,如果想要应用到所有的prefab,点击Override——Apply all,或者使用Revert all来恢复默认

应用Prefab

如果想取消prefab的引用关系,选中后在GameObject——Prefab——Unpack即可

取消prefab

监听PrefabUtility.PrefabInstanceUpdated事件即可知道Prefab何时被保存,这个代码在UGUI章节写过

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
using UnityEngine;
using UnityEditor;

public class PrefabSavingListener
{
[InitializeOnLoadMethod]
static void InitializeOnloadMethod()
{
//监听prefab被保存事件
PrefabUtility.prefabInstanceUpdated = (GameObject go) =>
{
Debug.LogFormat("path:{0}", AssetDatabase.GetAssetPath(PrefabUtility.GetCorrespondingObjectFromSource(go)));
};
}
}

动画编辑器

通过时间线来修改组件参数。还可以在时间线上添加动画事件。编辑后的动画可以应用到UI元素、2D元素或模型等,只要配合Animator组件就可以。

动画编辑器面板

编辑器面板在Windows——Animation里,快捷键Ctrl+6。如果想要一个Animation面板激活,需要选中一个GameObject,并且挂载Animator组件,如果没有Animator组件,在Animation窗口有快速创建的按钮

Animation面板

在编辑器中添加事件

我们像之前CollisionPublisherTriggerPublisher一样,新建AnimationPublisher脚本,UnityEvent事件默认是不带参数的,如果需要参数,就要继承UnityEvent<T>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;

public class AnimationEvent : UnityEvent<int> { }
public class AnimationPublisher : MonoBehaviour
{
public static AnimationEvent animationEvent = new AnimationEvent();
public void MyCustomEvent(int intValue)
{
animationEvent.Invoke(intValue);
}
}

AnimationPublisher脚本挂载在有Animator的GameObject上,在Animation窗口中找合适的动画和时间线位置添加事件,执行MyCustomEvent方法

使用事件

动画事件引用的方法必须是public,最多能有一个编辑参数

导入类动画

将含有模型以及动画的FBX文件导入Unity就可以使用了,多动画文件共用一份Mesh文件,需要提前确定好动画命名规则,比如以@作为标记,“model@idle、model@run”等

导入后,还可以做很多特殊设置,下面是Model选项卡的部分

  • 使用 Scale FactorConvert Units 属性可调整 Unity 对单位的解释。例如,3ds Max 使用 1 个单位表示 10 厘米,而 Unity 使用 1 个单位表示 1 米。
  • 使用 Mesh CompressionRead/Write EnabledOptimize MeshKeep QuadsIndex FormatWeld Vertices 属性可减少资源并节省内存。
  • 如果模型文件来自 Maya 或 3ds Max,或者任何其他支持变形目标动画的 3D 建模应用程序,则可以启用 Import BlendShapes 选项。
  • 可为环境几何形状启用 Generate Colliders 选项。
  • 可启用特定的 FBX 设置,如 Import VisibilityImport CamerasImport Lights
  • 对于仅包含动画的模型文件,可启用 Preserve Hierarchy 选项以防止骨架层级视图不匹配。
  • 如果使用了__光照贴图 (Lightmap),则可设置 Swap UVs__ 和 Generate Lightmap UVs
  • 可使用 NormalsNormals ModeTangentsSmoothing Angle 选项来控制 Unity 如何处理模型中的法线 (Normals) 和切线 (Tangents)。

具体可以参考

导入一个模型 - Unity 手册 (unity3d.com)

导入类动画在Rig选项卡中设置,分为Humanoid(人形重定向动画)、Generic(通用动画)和Legacy(老版动画)三种模式。

使用 Rig 选项卡设置骨架并使用 Animation 选项卡提取或定义动画剪辑的准则。人形和通用(非人形)动画类型的工作流程不同,因为 Unity 要求人形类型有非常具体的骨骼结构,但对于通用类型只需了解哪个骨骼是根节点

人形重定向动画Humanoid

Rig 选项卡 - Unity 手册 (unity3d.com)

人形重定向动画就是多个身形不同的人物模型可以共用一份骨骼动画,此技术应用在游戏中会大量减少内存和包体大小。

在Animation type设定为Humanoid的情况下,根据“Create from this model”或“Copy from Other Avatar”的确定Avater

Rig选项卡

选中Optimize Game Object复选框,Unity 将忽略属于层级视图但未映射在 Avatar 中的任何Transform,用来提高CPU性能。但是可以使用 Extra Transforms to Expose 来让Unity让一些特定的骨骼节点纳入计算

Extra Transforms to Expose

单击Configure可以进入Avatar编辑界面,可以用来确定骨骼节点信息(Mapping选项卡)和肌肉拉伸信息(Muscles & Settings选项卡)。

Avatar

有的时候人形还有额外的骨骼信息,比如武器、披风和头发等,但是Unity默认情况下是不处理的。如果想要引入额外的骨骼信息来作为模板Avatar,需要选中Animation选项卡——Mask,然后Definition设为Create From This Model,在Transform中选择需要的骨骼节点,这样的话别的模型需要播放这个动画,也需要这些骨骼节点信息。

通用动画Generic

通用动画不支持重定向动画,使用Create From This Model来创建Avatar,因为Unity内动画组件依赖Avatar对象,Root node指的是当前模型骨骼的根节点,如果此模型没有游戏内移动需求就不需要设定。其余设定与Humanoid相同

Generic RIg

Legacy动画

Legacy动画可以提供最原始的接口,开发者可以自行处理,开发比较灵活,不过效率较低,Unity已停止更新

导入类动画事件

在Project视图中选择动画文件,在Animation分页展开Evevts标签,可以添加自定义动画事件,点击左上角加号图标,就可以添加一个新事件,其中Function就是事件回调方法的名称,Float、Int、String、Object表示参数。请确保在其animator中使用此动画的任何游戏对象都附加了相应的脚本,其中包含具有匹配事件名称的函数。

Events配合预览