Animation Clip
Animation Clip 是 Unity 动画的基本单位——一段关键帧序列,随时间改变一个或多个对象的位置、旋转、缩放或颜色等属性。它是 Animator、Timeline 与 Legacy Animation 的核心素材,帮助动画师与程序把角色动作、镜头与 UI 动效沉淀为可复用、可混合的项目资源。
想象一下...
Animation Clip 像传统动画师手里的胶片条。他们画出重要的关键帧(起跳、顶点、落地),然后软件插值中间帧。Clip 就是那组关键帧——"0.0s 手在 A;0.5s 在 B;1.0s 回到 A"。Unity 读取 clip,每帧更新 GameObject 属性。
概念详解
Animation Clip 是一种资源
(.anim),
按属性用 curves 存储动画——一个 Binding(组件上的属性路径)加一个
AnimationCurve(带切线的关键帧)。可动画任意可序列化属性:Transform 位置/旋转/缩放、
Material 颜色、float、bool、sprite,甚至 prefab 引用。
每个 Keyframe 有数值与两条切线(in/out),塑造关键帧之间的 Bezier。
常见插值:Smooth(自动切线)、
Linear(帧间直线)、Constant(保持到下一关键帧——精灵翻页)。
Clip 有
wrapMode:
Loop、PingPong、ClampForever、Once。
Clip 来源有二:在 Unity 中创建(Animation 窗口、录制模式)或 从 FBX 导入(Unity 从文件拆出 clip)。Humanoid 绑定下,clip 使用 Muscle 系统(归一化骨骼)并可重定向到另一骨架。Generic 绑定则绑到本地骨骼路径。
Animation Events 很强大:在 clip 某一时刻放标记; Animator 播到时,会调用组件上的 C# 方法。用于脚步音效、生成特效或连招窗口。
Animation Clip 解剖
FootStep
FootStep
动手步骤
打开 Animation 窗口
Window → Animation → Animation。选中 GameObject → 创建新 clip,或从下拉选择已有 clip。
录制关键帧
按 Record(红圆)→ 移动播放头 → 在 Scene/Inspector 改属性 → Unity 写入关键帧。
调整切线
在 Curve 视图 → 右键关键帧 → Free/Flat/Linear/Constant 切线以塑造曲线。
添加 Animation Events
在 Timeline 栏 → 右键 → Add Animation Event → 输入方法名。方法必须存在于该 GameObject 的某个组件上。
配置 Loop 与 WrapMode
选中 Animation Clip 资源 → Inspector → Loop Time、Loop Pose(混合首尾)。移动类动画开启 Loop Pose,避免接缝卡顿。
交互模拟器
用不同插值模式预览 Animation Clip——选择缓动观察差异。
CURVE PREVIEW
代码示例
基础用 AnimationCurve 从代码构建 Animation Clip。
using UnityEngine;
public class ProceduralClip : MonoBehaviour
{
void Start()
{
AnimationClip clip = new AnimationClip();
clip.legacy = true; // Use with Animation (not Animator)
// Curve: jump up then land in 1 second
AnimationCurve curve = new AnimationCurve(
new Keyframe(0f, 0f), // t=0: position 0
new Keyframe(0.5f, 3f), // t=0.5: peak at 3
new Keyframe(1f, 0f) // t=1.0: back to 0
);
// Bind the curve to transform "localPosition.y"
clip.SetCurve("", typeof(Transform),
"localPosition.y", curve);
// Play with the legacy Animation component
Animation anim = gameObject.AddComponent<Animation>();
anim.AddClip(clip, "jump");
anim.Play("jump");
}
}代码示例
进阶从代码处理 Animation Events——脚步声与连招窗口。
using UnityEngine;
public class AnimationEventHandler : MonoBehaviour
{
public AudioClip[] footstepSounds;
AudioSource audioSrc;
void Awake() => audioSrc = GetComponent<AudioSource>();
// Called by an Animation Event when a foot hits the ground
// (Method name must match the Event in the editor)
void OnFootstep(AnimationEvent ev)
{
// ev.intParameter: 0 = left foot, 1 = right foot
int foot = ev.intParameter;
AudioClip sound = footstepSounds[
Random.Range(0, footstepSounds.Length)];
audioSrc.PlayOneShot(sound, 0.7f + foot * 0.1f);
}
// Callback when the combo window opens (set in the Attack clip)
void OnComboWindowOpen()
{
Debug.Log("Combo window open!");
}
}📌 快速记忆
- ▸Clip = 绑定到属性路径的 AnimationCurves
- ▸Keyframe 有数值 + in/out 切线用于缓动
- ▸Animation Events:clip 内的定时回调
- ▸Loop Pose:混合首尾实现无缝循环
- ▸Humanoid clip 可重定向;Generic clip 绑到特定骨架
⚠️ 常见错误
❌ Animation Event 从不触发
Event 方法名与组件上的方法不匹配,或组件挂在错误的 GameObject 上
✅ 方法名完全一致(区分大小写),且接收方 GameObject 正确
❌ 循环 clip 在接缝处卡顿
首尾关键帧数值不一致
✅ 开启 "Loop Pose",并保持根运动平稳