“Animator의 현재 실행 중인 애니메이션을 코드로 감지하고, 슬라이더나 값 변화에 따라 실시간으로 재생 위치를 제어할 수 있을까?”
이 글에서는 AnimatorClipInfo 와 Animator.Play() 의 세 번째 인자 normalizedTime 을 이용해
현재 재생 중인 애니메이션을 임의의 지점으로 이동시키는 방법을 정리합니다.
public void OnValueChanged_Slider(float value)
{
AnimatorClipInfo[] clipInfos = animator.GetCurrentAnimatorClipInfo(0);
if (clipInfos.Length > 0)
{
AnimationClip currentClip = clipInfos[0].clip;
Debug.Log("현재 클립: " + currentClip.name);
animator.Play(currentClip.name, 0, value); // normalizedTime
}
if (value == sliderEnd)
{
//슬라이더가 끝났을때
}
}
🧠 1. Animator란?
Animator는 Unity의 Mecanim 애니메이션 시스템을 담당하는 컴포넌트입니다.
State(상태) 기반으로 여러 애니메이션을 관리하며, 코드로 제어할 수 있습니다.
| State | 애니메이션의 한 단위 (예: Idle, Run, Attack 등) |
| Layer | 애니메이션 계층 구조 (보통 0 = Base Layer) |
| Transition | State 간 전환 규칙 |
| Parameter | 전이 조건을 결정하는 변수 (Trigger, Float 등) |
보통 Trigger나 SetBool로 전환하지만, Play()를 사용하면 전이 없이 즉시 특정 상태로 이동할 수 있습니다.
🧩 2. GetCurrentAnimatorClipInfo()
이 함수는 Animator에서 현재 재생 중인 AnimationClip 정보를 가져옵니다.
| clipInfos[0].clip | 현재 재생 중인 AnimationClip 객체 |
| clipInfos[0].weight | 해당 클립의 블렌딩 비중 (1.0 = 완전히 활성화) |
⚠️ Play() 직후에는 이전 클립이 반환될 수 있습니다.
→ animator.Update(0f)를 호출합니다
🎥 3. AnimationClip이란?
AnimationClip은 실제 애니메이션 데이터(.anim 파일)입니다.
Animator의 각 State에 연결되어 있습니다.
| name | 애니메이션 이름 |
| length | 총 길이 (초 단위) |
| frameRate | 초당 프레임 수 |
| wrapMode | 반복 재생 여부 (Loop 등) |
🧮 4. normalizedTime이란?
Animator.Play()의 세 번째 인자로 전달되는 값입니다.
애니메이션의 재생 위치를 0~1 비율로 표현합니다.
| 0.0f | 시작 프레임 |
| 0.5f | 중간 프레임 |
| 1.0f | 끝 프레임 |
즉, animator.Play("Walk", 0, 0.5f)
→ Walk 애니메이션의 절반 지점으로 점프합니다.
⚙️ 5. animator.Play(stateName, layer, normalizedTime)
| stateName | Animator Controller의 State 이름 (Clip 이름 아님!) |
| layer | 레이어 인덱스 (기본 0 = Base Layer) |
| normalizedTime | 재생 진행도 (0~1) |
이 메서드는 Transition을 거치지 않고 즉시 해당 State를 재생하기 때문에,
실시간 제어 UI(슬라이더, 버튼 등) 와의 연동에 자주 사용됩니다.
🧩 6. 슬라이더로 애니메이션 진행도 제어하기
UI의 Slider를 연결하면,
사용자가 움직이는 슬라이더 값(0~1)을 normalizedTime으로 직접 전달할 수 있습니다.
- 슬라이더 값 = 애니메이션 진행도
- 0 → 애니메이션 시작 프레임
- 1 → 애니메이션 마지막 프레임
슬라이더가 1-> 0으로 간다면
1- value
🧠 7. 즉시 갱신 안 되는 이유
Play() 직후 GetCurrentAnimatorClipInfo()가 이전 클립을 반환하는 이유는?
Unity의 Animator는 프레임 단위로 상태를 갱신합니다.
즉, Play()가 호출된 그 프레임에서는 아직 내부 State가 전환되지 않은 상태예요.
해결 방법
또는
📘 8. 정리 요약
| Animator | Mecanim 애니메이션 제어 컴포넌트 | |
| AnimatorClipInfo | 현재 재생 중인 클립 정보 구조체 | |
| AnimationClip | 실제 애니메이션 자산(.anim 파일) | |
| normalizedTime | 0~1로 표현된 애니메이션 진행 비율 | |
| Play() | 특정 State를 강제로 실행 | |
| layer | Animator Controller 내 레이어 인덱스 | |
| GetCurrentAnimatorClipInfo() | 현재 활성화된 클립 확인 | |
| Debug.Log() | 현재 상태 디버깅용 출력 |
'유니티' 카테고리의 다른 글
| Unity mesh 자르기 (0) | 2025.11.20 |
|---|---|
| 카메라 가까이 갔을때 오브젝트 페이드 (0) | 2025.11.14 |
| Unity 마우스로 3D 오브젝트를 로컬 X축으로만 드래그하기 (0) | 2025.11.03 |
| Unity 선따라 그리기 , LineRenderer + EdgeCollider2D로 경로 만들기 (0) | 2025.10.29 |
| Unity 3D DragDrop (0) | 2025.10.28 |