Animation Clip
Animation Clip은 애니메이션의 기본 단위로, 키프레임 시퀀스가 위치·회전·색 등 속성을 시간에 따라 바꿉니다. Curve·WrapMode·Animation Event와 Humanoid 리타깃 기초를 배우며 클립을 설계·기록·재생하는 입문형 학습 가이드입니다.
상상해 보세요...
Animation Clip은 전통 애니메이터의 필름 한 조각입니다. 중요한 키프레임(점프 시작, 정점, 착지)을 그리고, 소프트웨어가 중간을 보간합니다. 클립은 그 키프레임 집합입니다——「0.0초에 손이 A; 0.5초에 B; 1.0초에 다시 A」. Unity가 클립을 읽고 매 프레임 GameObject 속성을 갱신합니다.
개념 자세히
Animation Clip은
(.anim)
에셋으로, 속성마다 curves로 애니메이션을 저장합니다——Binding
(컴포넌트 상의 속성 경로)과 AnimationCurve(접선이 있는 키프레임). 직렬화 가능한
속성이면 무엇이든 애니메이션할 수 있습니다: Transform 위치/회전/스케일, Material 색,
float, bool, sprite, 심지어 prefab 참조까지.
각 Keyframe에는 값과 두 접선(in/out)이 있어 키 사이 Bezier를 만듭니다. 흔한
보간: Smooth(자동 접선),
Linear(프레임 사이 직선), Constant(다음 키까지
유지——스프라이트 플립북). 클립에는
wrapMode
가 있습니다: Loop, PingPong, ClampForever, Once.
클립 출처는 둘입니다: 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!");
}
}📌 빠른 정리
- ▸클립 = 속성 경로에 바인딩된 AnimationCurves
- ▸Keyframe = 값 + in/out 접선으로 이징
- ▸Animation Events: 클립 안의 시간 콜백
- ▸Loop Pose: 시작/끝 블렌드로 매끄러운 루프
- ▸Humanoid 클립은 리타깃; Generic은 특정 스켈레톤에 바인딩
⚠️ 흔한 실수
❌ Animation Event가 절대 발화하지 않음
Event 메서드 이름이 컴포넌트 메서드와 다르거나, 컴포넌트가 잘못된 GameObject에 있음
✅ 메서드 이름을 정확히 일치(대소문자 구분)시키고 수신 GameObject를 확인
❌ 루프 클립이 이음새에서 끊김
첫·마지막 키프레임 값이 일치하지 않음
✅ "Loop Pose"를 켜고 루트 모션을 고르게 유지