Unity Term Book
动画与 UI

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 解剖

Property
0.0s0.25s0.5s0.75s1.0s
Position.x
Position.y
Rotation.z
Scale
🔔 Events

FootStep

FootStep

Playhead:0.00s

动手步骤

1

打开 Animation 窗口

Window → Animation → Animation。选中 GameObject → 创建新 clip,或从下拉选择已有 clip。

2

录制关键帧

按 Record(红圆)→ 移动播放头 → 在 Scene/Inspector 改属性 → Unity 写入关键帧。

3

调整切线

在 Curve 视图 → 右键关键帧 → Free/Flat/Linear/Constant 切线以塑造曲线。

4

添加 Animation Events

在 Timeline 栏 → 右键 → Add Animation Event → 输入方法名。方法必须存在于该 GameObject 的某个组件上。

5

配置 Loop 与 WrapMode

选中 Animation Clip 资源 → Inspector → Loop Time、Loop Pose(混合首尾)。移动类动画开启 Loop Pose,避免接缝卡顿。

交互模拟器

用不同插值模式预览 Animation Clip——选择缓动观察差异。

CURVE PREVIEW

Time: 0.00sValue: 0.00Easing: Smooth

代码示例

基础

用 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",并保持根运动平稳