본문 바로가기
유니티

유니티 슬라이더로 애니메이션 타이밍 조절하기

by 유니티세상 2025. 11. 7.
반응형

“Animator의 현재 실행 중인 애니메이션을 코드로 감지하고, 슬라이더나 값 변화에 따라 실시간으로 재생 위치를 제어할 수 있을까?”

이 글에서는 AnimatorClipInfoAnimator.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()

 
AnimatorClipInfo[] clipInfos = animator.GetCurrentAnimatorClipInfo(0);

이 함수는 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)

 
animator.Play("StateName", 0, 0.5f);

 

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가 전환되지 않은 상태예요.

해결 방법

 
animator.Play("MyState", 0, 0f); animator.Update(0f); // 즉시 상태 갱신

또는

yield return null; // 한 프레임 대기 후 GetCurrentAnimatorClipInfo() 호출

📘 8. 정리 요약


Animator Mecanim 애니메이션 제어 컴포넌트  
AnimatorClipInfo 현재 재생 중인 클립 정보 구조체  
AnimationClip 실제 애니메이션 자산(.anim 파일)  
normalizedTime 0~1로 표현된 애니메이션 진행 비율  
Play() 특정 State를 강제로 실행  
layer Animator Controller 내 레이어 인덱스  
GetCurrentAnimatorClipInfo() 현재 활성화된 클립 확인  
Debug.Log() 현재 상태 디버깅용 출력  

 

 

반응형