乐于分享
好东西不私藏

【Unity动画捕获插件】Animation Recorder 运行时与编辑器动画捕获的完整实现思路详解

【Unity动画捕获插件】Animation Recorder 运行时与编辑器动画捕获的完整实现思路详解

在 Unity 动画制作流程中,动画通常来自 DCC 工具(如 Maya、Blender),或由 Animator Controller 驱动播放。但在越来越多的应用场景中,“动画并不是提前做好的,而是运行时产生的”例如 VR 体感动作、程序驱动的骨骼运动、BlendShape 表情捕捉、玩家行为回放等。

Animation Recorder 正是为这一类需求而设计的工具。它的核心价值在于:

把“实时变化的数据”转化为“可编辑、可导出、可复用的动画资源”。

本文将从整体架构 → 核心录制机制 → 数据结构 → 导出原理 → VR 扩展几个层面,系统解析 Animation Recorder 的工作原理。

一、Animation Recorder 的整体架构设计

从功能上看,Animation Recorder 同时覆盖了 Editor 模式 与 运行时(Runtime) 两种动画捕获场景,其整体架构可以拆解为四个核心模块:

  1. 数据采集层(Recorder Layer)
  2. 时间轴与关键帧管理(Timeline & Keyframe)
  3. 数据序列化与动画重建(Serialization & Reconstruction)
  4. 导出系统(Export Pipeline)

它并不是简单地“录屏式记录动画”,而是真正意义上的动画数据采集系统

二、动画捕获的核心思想:采样而不是回放

Animation Recorder 的底层思想可以用一句话概括:

在每一帧,对目标对象的“动画驱动属性”进行采样,并保存为时间序列。

这些被采样的属性主要包括两大类:

1️⃣ 骨骼动画(Skeleton Animation)

  • Transform.localPosition
  • Transform.localRotation
  • Transform.localScale

插件会遍历 Animator 所绑定的 骨骼层级结构(Transform Hierarchy),对每一个骨骼节点进行采样。

2️⃣ BlendShape 动画(Morph Target)

  • SkinnedMeshRenderer.GetBlendShapeWeight(index)

每一个 BlendShape 实际上就是一个 float 曲线,Animation Recorder 会将其视为与骨骼动画同等重要的动画通道。

三、Recorder 的工作流程拆解

1. 录制启动(Run Animator)

当你在 Animation Recorder 窗口点击 Run Animator 时,插件内部会做几件关键事情:

  • 锁定当前选中的 GameObject
  • 获取其 Animator 组件
  • 解析 Animator 绑定的 Avatar / Skeleton
  • 构建一份“可记录节点列表”

这一步本质上是在做 动画目标分析(Target Analysis)

2. 实时采样(Per-Frame Recording)

在录制过程中,每一帧都会执行如下逻辑:

当前时间 → 遍历骨骼 → 记录 Transform         → 遍历 SkinnedMesh → 记录 BlendShape

关键点在于:

  • 采样基于 Time.deltaTime
  • 每一帧的数据都会被打上时间戳
  • 数据并不会立即生成 AnimationClip

而是先进入 内存中的时间序列缓存结构

四、关键帧与时间轴管理机制

1️⃣ 时间轴并不是“帧索引”

Animation Recorder 并不是简单地记录「第 N 帧的状态」,而是构建了一个 浮点时间轴(float time)

这意味着:

  • 支持不同帧率下的重建
  • 支持动画曲线平滑与插值
  • 更利于跨平台与跨工具导出(GLB / FBX)

2️⃣ 动画通道(Animation Channel)

在内部,每一种动画属性都会被抽象为一个 动画通道

  • 一个骨骼的 Position 是 3 个通道(X/Y/Z)
  • Rotation 是 4 个(Quaternion)
  • 每个 BlendShape 是 1 个通道

最终形成的是一个类似这样的结构:

AnimationData ├─ Bone_Head.Rotation.X → Keyframes[] ├─ Bone_Head.Rotation.Y → Keyframes[] ├─ BlendShape_Smile → Keyframes[]

这与 Unity AnimationClip 的底层结构高度一致。

五、动画修改能力的实现原理

Animation Recorder 并不只是“录完就完了”,它支持对捕获数据进行修改,这背后依赖两个机制:

1️⃣ 中间数据结构(非 AnimationClip)

在导出前,动画数据始终以 自定义数据结构存在,而不是直接写入 AnimationClip。

好处包括:

  • 可删除、合并、裁剪动画段
  • 可对某些骨骼或 BlendShape 做过滤
  • 可进行动画叠加与拼接

2️⃣ 非破坏式编辑(Non-Destructive)

修改操作并不会影响原始采样数据,而是基于拷贝或引用层进行,这使得插件非常适合作为:

  • 动画编辑器
  • 调试工具
  • 动画重建工具

六、导出系统的技术原理

1️⃣ Generic Animation Clip 生成

在 Unity Editor 中创建 AnimationClip 的流程是最基础的一种:

  • 遍历所有动画通道
  • 将 Keyframe 写入 AnimationCurve
  • 绑定到对应的路径(Transform Path)

这是 Lite 版本也支持的能力。

2️⃣ GLB 导出的实现思路

GLB(glTF Binary)是一种跨平台动画格式,Animation Recorder 的导出逻辑大致为:

  • 将骨骼结构转为 glTF Node
  • 将动画通道映射为 glTF Animation Sampler
  • 时间轴 → input
  • 数值曲线 → output

由于 glTF 原生支持骨骼动画和 Morph Target,这使得:

  • 移动端
  • WebGL
  • VR 应用

都能非常自然地使用这些动画数据。

3️⃣ FBX 导出(Windows)

FBX 导出依赖平台相关 SDK,因此只在 Windows 下提供。其本质是:

  • 构建 FBX Skeleton
  • 将时间序列写入 FBX Animation Layer
  • 生成可被 Maya / Blender 读取的动画文件

七、VR Body Tracking 的工作机制

Animation Recorder 与 Meta Movement SDK 的结合,是一个非常典型的应用场景。

其核心逻辑是:

  • VR SDK 驱动 Avatar 骨骼实时运动
  • Animation Recorder 仅作为“数据监听者”
  • 每一帧采样 VR 设备驱动后的骨骼状态

这意味着:

插件本身并不关心“动画来自哪里”,它只关心 Transform 和 BlendShape 的最终状态

这也是它能适配各种体感、程序动画、AI 驱动动画的根本原因。

八、典型应用场景的技术价值总结

从技术角度看,Animation Recorder 的价值主要体现在:

  • 运行时动画资产化
  • 动画调试可视化
  • 程序动画 → 美术动画的桥梁
  • VR / AR 动作捕获的低门槛实现

它并不是 Animator 的替代品,而是一个连接“实时行为”与“动画资源”的中间层工具

九、结语

Animation Recorder 本质上解决的是一个长期存在、但常被忽视的问题:

Unity 动画系统“只能播放动画”,但很难“反向生成动画”。

通过对骨骼与 BlendShape 的实时采样、时间轴管理和多格式导出,它让动画不再只是美术资产,而成为一种可记录、可分析、可重构的数据形态

如果你正在做:

  • VR 动作捕捉
  • 程序驱动动画
  • 动画编辑工具
  • 或动画调试系统

那么 Animation Recorder 的实现思路,本身就非常值得深入学习和借鉴。

本站文章均为手工撰写未经允许谢绝转载:夜雨聆风 » 【Unity动画捕获插件】Animation Recorder 运行时与编辑器动画捕获的完整实现思路详解

评论 抢沙发

8 + 6 =
  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
×
订阅图标按钮