Animation Clip
Animation Clip はアニメーションの基本単位で、位置・回転・色などのプロパティを時間とともに変化させるキーフレーム列です。カーブ、Wrap Mode、Animation Events で再生と演出を細かく制御できます。図解とシミュレーターでクリップ構造を直感的に学べ、制作の基礎を固められます。
想像してみてください...
Animation Clip は伝統的なアニメーターのフィルム一片です。重要なキーフレーム(ジャンプ開始、頂点、着地)を描き、ソフトが中割りを補間します。クリップはそのキーフレーム集合——「0.0 秒で手が A、0.5 秒で B、1.0 秒で再び A」。Unity がクリップを読み、毎フレーム GameObject のプロパティを更新します。
概念の詳細
Animation Clip は
(.anim)
アセットで、プロパティごとの curve としてアニメーションを保存します——Binding(コンポーネント上のプロパティパス)と AnimationCurve(接線付きキーフレーム)。シリアライズ可能なプロパティなら何でも動かせます: Transform の位置/回転/スケール、Material の色、float、bool、sprite、さらには prefab 参照。
各 Keyframe には値と 2 本の接線(in/out)があり、キー間の Bezier を形作ります。よく使う補間: Smooth(自動接線)、
Linear(フレーム間を直線)、Constant(次キーまで保持——スプライトフリップブック)。クリップには
wrapMode
があります: Loop、PingPong、ClampForever、Once。
クリップの出所は 2 つ: Unity 内で作成(Animation ウィンドウ、Record モード)か、FBX からインポート(Unity がファイルからクリップを分割)。Humanoid リグではクリップが Muscle system(正規化ボーン)を使い、別スケルトンへリターゲットできます。Generic リグはローカルボーンパスにバインドします。
Animation Events は強力です: クリップ内の時刻にマーカーを置き、Animator が到達するとコンポーネント上の C# メソッドが発火します。足音オーディオ、FX 生成、コンボウィンドウなどに使います。
Animation Clip の構造
FootStep
FootStep
ハンズオン手順
Animation ウィンドウを開く
Window → Animation → Animation。GameObject を選び → 新規クリップを作成するか、ドロップダウンから既存を選びます。
キーフレームを記録
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!");
}
}📌 要点
- ▸クリップ = プロパティパスにバインドされた AnimationCurve
- ▸Keyframe は値 + in/out 接線でイージングを決める
- ▸Animation Events: クリップ内の時刻付きコールバック
- ▸Loop Pose: 開始/終了をブレンドして継ぎ目のないループ
- ▸Humanoid クリップはリターゲット可、Generic は特定スケルトンにバインド
⚠️ よくあるミス
❌ Animation Event が一度も発火しない
Event のメソッド名がコンポーネント上のメソッドと一致しない、または受信側 GameObject が違う
✅ メソッド名を完全一致(大文字小文字区別)させ、受信 GameObject も合わせる
❌ ループクリップが継ぎ目でヒッチする
最初と最後のキーフレーム値が一致していない
✅ "Loop Pose" を有効にし、ルートモーションを均等に保つ