Animation Clip
Animation Clip là đơn vị cơ bản của hệ thống hoạt hình — chuỗi keyframe thay đổi thuộc tính (vị trí, xoay, màu) theo thời gian trên một hoặc nhiều đối tượng.
Hãy tưởng tượng...
Animation Clip giống như một đoạn phim thủ công của hoạ sĩ hoạt hình truyền thống. Họ vẽ từng keyframe quan trọng (bắt đầu nhảy, đỉnh nhảy, đáp xuống), rồi phần mềm tự nội suy (interpolate) các khung giữa. Animation Clip là tập hợp những keyframe đó — "tại giây 0.0, tay ở vị trí A; tại giây 0.5, tay ở vị trí B; tại giây 1.0, tay về A". Unity đọc clip này và cập nhật thuộc tính GameObject theo mỗi frame play.
Khái niệm chi tiết
Animation Clip là asset
(.anim)
lưu dữ liệu hoạt hình dưới dạng các curve (đường cong) cho từng thuộc tính —
Binding (ràng buộc đến property path của component) + AnimationCurve (chuỗi
Keyframe với tangent). Có thể animate bất kỳ thuộc tính serializable nào: Transform
position/rotation/scale, Material color, float, bool, sprite, thậm chí reference đến prefab.
Mỗi Keyframe có giá trị và hai tangent (in-tangent, out-tangent) điều khiển
đường cong Bezier giữa hai keyframe. Chế độ interpolation phổ biến: Smooth
(tự tính tangent mượt), Linear (đường thẳng giữa các frame),
Constant (giữ nguyên giá trị đến keyframe tiếp — dùng cho sprite flipbook).
Clip có thể đặt
wrapMode:
Loop, PingPong, ClampForever, Once.
Animation Clip có hai nguồn: Created in Unity (dùng Animation window, record mode) hoặc Imported từ file FBX (sau khi import, Unity tách Animation Clip từ FBX và cho phép cấu hình). Đối với Humanoid rig, clip dùng Muscle system (chuẩn hoá xương) — có thể retarget sang skeleton khác. Generic rig dùng local bone path trực tiếp.
Animation Events là tính năng mạnh: thêm marker tại timepoint cụ thể trong clip, khi Animator đến đó sẽ gọi hàm C# trên component. Dùng để phát âm thanh bước chân đúng thời điểm, spawn hiệu ứng, notify combo window…
Cấu trúc Animation Clip
FootStep
FootStep
Hướng dẫn thực hành
Mở Animation Window
Window → Animation → Animation. Chọn GameObject → tạo clip mới hoặc chọn clip có sẵn trong dropdown.
Record keyframes
Nhấn nút Record (vòng tròn đỏ) → di chuyển playhead đến thời điểm muốn → thay đổi property trong Scene/Inspector → Unity tự tạo keyframe.
Điều chỉnh tangent
Trong Curve view → chuột phải keyframe → chọn Free/Flat/Linear/Constant tangent để điều chỉnh đường cong animation.
Thêm Animation Events
Trong Timeline bar → chuột phải → Add Animation Event → nhập tên hàm. Hàm phải tồn tại trên Component của GameObject.
Cấu hình Loop và WrapMode
Chọn Animation Clip asset → Inspector → Loop Time, Loop Pose (blend đầu/cuối clip). Bật Loop Pose cho locomotion để không bị giật.
Trình mô phỏng tương tác
Xem trước Animation Clip với các chế độ nội suy khác nhau — chọn easing để thấy sự khác biệt.
CURVE PREVIEW
Ví dụ Code
Cơ bảnTạo Animation Clip programmatically với AnimationCurve.
using UnityEngine;
public class ProceduralClip : MonoBehaviour
{
void Start()
{
AnimationClip clip = new AnimationClip();
clip.legacy = true; // Dùng với Animation (không phải Animator)
// Tạo curve: nhảy lên rồi rơi xuống trong 1 giây
AnimationCurve curve = new AnimationCurve(
new Keyframe(0f, 0f), // t=0: vị trí 0
new Keyframe(0.5f, 3f), // t=0.5: đỉnh cao 3
new Keyframe(1f, 0f) // t=1.0: về 0
);
// Gán curve vào property "localPosition.y" của transform
clip.SetCurve("", typeof(Transform),
"localPosition.y", curve);
// Phát bằng component Animation (legacy)
Animation anim = gameObject.AddComponent<Animation>();
anim.AddClip(clip, "jump");
anim.Play("jump");
}
}Ví dụ Code
Nâng caoĐọc dữ liệu clip (bindings, curves) và xử lý Animation Events từ code.
using UnityEngine;
public class AnimationEventHandler : MonoBehaviour
{
public AudioClip[] footstepSounds;
AudioSource audioSrc;
void Awake() => audioSrc = GetComponent<AudioSource>();
// Được gọi bởi Animation Event trong clip khi chân chạm đất
// (Tên hàm phải khớp với tên trong Animation Event editor)
void OnFootstep(AnimationEvent ev)
{
// ev.intParameter: 0 = chân trái, 1 = chân phải
int foot = ev.intParameter;
AudioClip sound = footstepSounds[
Random.Range(0, footstepSounds.Length)];
audioSrc.PlayOneShot(sound, 0.7f + foot * 0.1f);
}
// Callback khi combo window mở (set trong Attack clip)
void OnComboWindowOpen()
{
Debug.Log("Có thể combo!");
}
}📌 Ghi nhớ nhanh
- ▸Clip = tập hợp AnimationCurve gắn với property path
- ▸Keyframe có value + in/out tangent cho easing
- ▸Animation Events: callback theo thời gian trong clip
- ▸Loop Pose: blend đầu/cuối để loop mượt
- ▸Humanoid clip: retargetable; Generic: gắn với skeleton cụ thể
⚠️ Lỗi thường gặp
❌ Animation Event không được gọi
Tên hàm trong Event không khớp với hàm trên component, hoặc component không đính trên đúng GameObject
✅ Kiểm tra chính xác tên hàm (case-sensitive) và GameObject receiver
❌ Clip loop bị giật ở điểm nối đầu-cuối
Giá trị keyframe đầu và cuối không khớp
✅ Bật "Loop Pose" và đảm bảo root motion đồng đều