在 Unity 中制作动画或动效有多种方式,每种方法适用于不同的场景和需求。以下是 8 大类常见实现方式及其特点,帮助你全面理解 Unity 动画生态:
1. 传统帧动画(Sprite Animation)
- 原理:逐帧切换 Sprite 图片序列模拟动画。
- 实现工具:
- Animation 窗口:直接创建关键帧动画,切换 Sprite。
- Sprite 编辑器:切割图集后生成动画。
- 特点:
- 简单直观,适合像素风、UI 特效。
- 资源占用高(需多张图片),灵活性差。
- 代码示例(通过代码切换 Sprite):
public Sprite[] frames; public float frameRate = 0.1f; private int currentFrame; private SpriteRenderer renderer; void Start() { renderer = GetComponent<SpriteRenderer>(); InvokeRepeating("NextFrame", 0, frameRate); } void NextFrame() { renderer.sprite = frames[currentFrame % frames.Length]; currentFrame++; }
2. 骨骼动画(2D/3D)
- 原理:通过骨骼层级驱动角色部件运动。
- 工具/插件:
- 2D:Spine、DragonBones(需导入插件)。
- 3D:Unity 内置 Humanoid/Generic 动画系统 + Blender/Maya。
- 特点:
- 资源高效,动作可复用。
- 支持动画混合、换装、反向动力学(IK)。
- 流程:
- 在外部工具(如 Spine)绑定骨骼并导出动画数据。
- 在 Unity 中使用
SkeletonAnimation
组件播放。
3. Unity 动画系统(Animator & Animation)
- 原理:基于关键帧的动画系统,控制物体属性(位置、旋转、缩放等)。
- 核心组件:
- Animation 窗口:制作简单关键帧动画(.anim 文件)。
- Animator 控制器:管理动画状态机,支持过渡、混合、层级。
- 适用场景:
- 3D 角色动画、机械运动、UI 动效。
- 可与程序逻辑结合(通过 Animator Parameters 控制状态)。
4. 程序化动画(Procedural Animation)
- 原理:通过代码实时计算物体运动,不依赖预制作动画。
- 常见实现:
- 物理驱动:Rigidbody 力/速度控制、粒子系统(PhysX)。
- 数学函数:正弦波、Lerp、曲线运动(如
Mathf.Sin
)。 - 路径动画:通过
Vector3.Lerp
或Dotween.Path
沿路径移动。
- 代码示例(弹性运动):
public float speed = 2f; public float amplitude = 1f; void Update() { float y = Mathf.Sin(Time.time * speed) * amplitude; transform.position = new Vector3(transform.position.x, y, 0); }
5. 时间轴动画(Timeline)
- 原理:可视化编排多对象、多轨道的复杂动画序列。
- 工具:Unity Timeline 编辑器。
- 特点:
- 支持动画、音频、事件、粒子等多轨道同步。
- 可创建过场动画(Cinematics)或复杂交互动效。
- 流程:
- 创建 Timeline Asset,添加 Animation Track、Activation Track 等。
- 通过 Playable Director 组件触发播放。
6. Shader 动画
- 原理:通过着色器代码实时修改材质属性(颜色、UV、顶点位置)。
- 常见效果:
- UV 滚动(水流、火焰)。
- 顶点位移(旗帜飘动、水面波纹)。
- 溶解、渐变动效。
- Shader Graph 示例(UV 滚动):
- 使用 Shader Graph 创建
Time
节点驱动UV Offset
。 - 代码控制参数:
material.SetFloat("_ScrollSpeed", 0.5f);
7. UI 动效
- 实现方式:
- UGUI 动画:通过 Animation 窗口制作 RectTransform 动画。
- UI Toolkit:使用 USS 和 C# 代码驱动动画(适合复杂 UI)。
- 插件:DOTween(补间动画)、LeanTween。
- 代码示例(DOTween 缩放):
using DG.Tweening; public RectTransform uiElement; void Start() { uiElement.DOScale(1.2f, 0.3f).SetLoops(-1, LoopType.Yoyo); }
8. 第三方插件与工具
- DOTween:高性能补间动画库,简化代码动画。
- Final IK:高级反向动力学解决方案。
- Playmaker:可视化状态机工具,无需代码制作动画逻辑。
- Cinemachine:专业镜头动画和相机控制。
如何选择?
- 简单动效:帧动画、DOTween。
- 角色动画:骨骼动画(Spine/Animator)。
- 过场动画:Timeline。
- 物理/数学效果:程序化动画。
- UI 交互:UGUI + DOTween。
根据项目类型(2D/3D)、性能需求、团队技能灵活组合这些方法,例如用 Spine 做角色动画 + Shader 做特效 + DOTween 处理 UI。