본문 바로가기

스테이트 머신의 기본 활용

Idle과 Walk_Run 상태 및 속도 기반 전환 규칙을 만들고, 이동 상태 안에서 걷기와 달리기를 블렌딩합니다.

지난 절에서 애님 그래프 기본 구성 요소를 살펴보며 스테이트 머신(State Machine)이 캐릭터 애니메이션 제어의 핵심임을 확인했습니다.

이번 절에서는 스테이트 머신을 더 깊게 이해하고, 실제 캐릭터 움직임 기반으로 애니메이션 상태를 관리하는 방법을 정리합니다.


스테이트 머신이란 무엇인가?

스테이트 머신(State Machine)은 특정 조건에 따라 캐릭터의 애니메이션 상태를 전환하고 관리하는 애님 그래프의 핵심 노드입니다.

마치 신호등이 빨간 불, 노란 불, 초록 불이라는 상태를 가지며, 정해진 시간이나 규칙에 따라 이 상태들을 전환하는 것과 같습니다.

캐릭터 애니메이션에서 상태는 일반적으로 특정 행동을 나타냅니다.

예를 들어, Idle (대기), Walk (걷기), Run (달리기), Jump (점프), Attack (공격) 등이 상태가 될 수 있습니다.

스테이트 머신이 필요한 이유
  • 명확한 상태 관리: 캐릭터가 어떤 애니메이션 상태에 있는지 시각적으로 명확하게 파악하고 관리할 수 있습니다.
  • 부드러운 전환: 각 상태 간의 전환 규칙을 정의하여 애니메이션이 갑자기 끊기지 않고 자연스럽게 이어지도록 합니다.
  • 복잡한 로직 단순화: 다양한 애니메이션 조합과 전환 로직을 스테이트 머신이라는 구조 안에서 체계적으로 구성할 수 있습니다.
  • 디버깅 용이성: 특정 상태에서 애니메이션이 제대로 재생되지 않거나 전환이 이상할 때, 해당 상태와 전환 규칙만 집중적으로 살펴볼 수 있어 문제 해결이 용이합니다.

스테이트 머신의 기본 구성 요소

스테이트 머신을 더블클릭하여 진입하면 다음과 같은 요소들을 볼 수 있습니다.

상태 (State)
  • 캐릭터의 특정 행동을 나타내는 상자 모양의 노드입니다. 각 상태 안에는 해당 상태에서 재생될 애니메이션 로직(애니메이션 시퀀스, 블렌드 스페이스 등)이 들어갑니다.
  • 진입점(Entry Point): 스테이트 머신에 처음 진입할 때 시작되는 기본 상태입니다.
전환 규칙
  • 두 상태를 연결하는 화살표 모양의 선입니다. 이 선은 한 상태에서 다른 상태로 전환될 수 있는 경로를 나타냅니다.
  • 전환 규칙을 더블클릭하면 해당 전환이 발생할 조건을 정의하는 별도의 그래프(Transition Graph)가 열립니다.

스테이트 머신 내부에서는 상태 상자보다 연결선의 조건이 실제 동작을 결정합니다.

Entry에서 시작해 전환 규칙을 거쳐 다시 복귀하는 흐름으로 보면 구조를 놓치지 않습니다.


스테이트 머신 활용 예시: Idle과 Walk_Run

Idle과 Walk_Run 두 상태를 만들고, 이동 상태 안에서 걷기와 달리기를 Blend Space로 섞어 봅시다.

이 예시는 대부분의 캐릭터 애니메이션 시스템의 기본이 됩니다.

필요한 에셋
  • Idle 애니메이션 시퀀스 (예: SKM_Mannequin_Idle)
  • BS_WalkRun (Blend Space 1D, 축: Speed, 포함 애니메이션: Idle, Walk, Run). 캐릭터와 호환되는 스켈레톤을 사용합니다.

아직 BS_WalkRun이 없다면 다음 절의 블렌드 스페이스 생성 및 설정까지만 진행해 주세요. 에셋을 저장한 뒤 이 절로 돌아오면 됩니다. 애님 블루프린트에 연결하는 작업은 아래에서 함께 진행합니다.

애님 블루프린트 설정

애님 블루프린트 열기: 여러분의 캐릭터 스켈레톤에 연결된 애님 블루프린트 (예: ABP_Mannequin)를 엽니다.

이벤트 그래프 설정 (변수 업데이트)
  • Event Blueprint Update Animation 노드를 가져옵니다. 이 이벤트는 애니메이션 업데이트 때 호출됩니다. 업데이트 주기는 틱·최적화 설정에 따라 달라질 수 있습니다.
  • Try Get Pawn Owner 노드를 가져와 이 애니메이션 블루프린트를 사용하는 폰(Pawn, 즉 캐릭터)의 참조를 얻습니다.
  • Try Get Pawn Owner의 Return Value에서 드래그하여 IsValid 노드를 연결하여 폰이 유효한지 확인합니다.
  • 업데이트 이벤트의 실행 선을 IsValid에 연결하고 Is Valid 실행 출력 뒤에 Cast To Character (또는 Cast To BP_PlayerCharacter)를 둡니다.
  • 캐스팅 결과 객체 핀(As Character)에서 Get Velocity 노드를 호출하여 현재 이동 속도를 얻습니다.
  • 지상 이동 예제이므로 Get Velocity의 출력에 Vector Length XY를 연결하여 수직 속도를 제외한 속도를 계산합니다.
  • 이 속도 값을 저장할 Speed라는 Float 타입 변수를 애님 블루프린트에 추가하고, Set Speed 노드를 연결하여 업데이트합니다. 캐스팅 성공 실행 출력도 Set Speed의 실행 입력에 연결합니다. (Speed 변수는 나중에 스테이트 머신의 전환 규칙과 블렌드 스페이스에서 사용됩니다.)
  • 컴파일하고 저장합니다.
애님 그래프 - 스테이트 머신 설정
  • 애님 그래프 탭으로 이동합니다.
  • 앞 절에서 추가한 Default State Machine이 최종 포즈에 연결되어 있는지 확인한 뒤 내부로 진입합니다.
  • Entry 노드에서 Idle 상태로 연결되는 선이 없다면, Entry 노드에서 드래그하여 Add State를 선택하고 Idle이라는 상태를 만듭니다.
  • Idle 상태를 더블클릭하고 애니메이션 에셋을 드래그해 시퀀스 플레이어를 만든 뒤 Output Pose에 연결합니다.
  • Idle 상태에서 드래그하여 Add State를 선택하고 Walk_Run이라는 상태를 만듭니다.
  • Walk_Run 상태를 더블클릭하여 내부로 진입합니다.
    • BS_WalkRun 에셋을 상태 그래프에 드래그합니다.
    • 생성된 플레이어의 Speed 입력에 애님 블루프린트의 Speed 변수(Get 노드)를 연결합니다.
    • Output Pose 노드에 연결합니다.
  • 전환 규칙 설정
    • Idle에서 Walk_Run으로 가는 전환 규칙 선을 더블클릭합니다.
    • Can Enter Transition 출력 핀에 연결될 로직을 만듭니다. Speed 변수(Get 노드)를 가져와 > (보다 큼) 노드를 연결하고, 0.1과 비교합니다. (미세한 움직임에도 전환되지 않도록 작은 값을 사용)
    • Walk_Run에서 Idle로 가는 전환 규칙 선을 더블클릭합니다.
    • Can Enter Transition 출력 핀에 연결될 로직을 만듭니다. Speed 변수(Get 노드)를 가져와 <= (작거나 같음) 노드를 연결하고, 0.1과 비교합니다. 이 예제는 같은 경계값으로 양쪽을 나누며, 떨림을 줄일 때는 진입·복귀 임계값을 서로 다르게 둘 수 있습니다.
  • 컴파일하고 저장합니다.

Speed의 단위도 축과 맞춥니다. 기본 거리 단위가 cm인 프로젝트에서 Velocity가 (300, 400, 1200) cm/s이면 이 지상 실습의 Vector Length XY는 √(300² + 400²) = 500 cm/s입니다. Z의 1200을 더해 1300 cm/s로 계산하는 전체 벡터 길이와 구별합니다.

경계값과 수직 이동을 따로 판단하기

주어진 전환 규칙 그대로 Speed=0.1일 때 Idle에서 Walk_Run으로 진입할 수 있을까요? Walk_Run에서는 Idle로 복귀할 수 있을까요? Velocity가 (0, 0, 500) cm/s인 경우 이 지상 Speed는 얼마일까요?

두 비교 연산과 XY 길이로 풀이하기

0.1 > 0.1은 false이므로 진입하지 않고, 0.1 ≤ 0.1은 true이므로 복귀 조건을 충족합니다. 수직 속도만 있으면 XY 길이는 0입니다. 이 두 상태만으로 점프 중인지 판정하는 것은 아닙니다. 공중 동작이 필요하면 별도의 공중 조건과 상태를 추가해야 합니다. 상태 선택 조건이 참이라는 사실과 전환 블렌드가 끝났다는 사실도 같은 순간으로 가정하지 않습니다.

스테이트 머신은 상태보다 전환 규칙이 많아질 때 복잡해집니다.

조건을 짧게 나누고 우선순위를 점검하면 디버깅이 쉬워집니다.


같은 Speed 경계의 두 방향 전환을 모두 연결합니다

Entry가 Idle로 진입한 뒤 Speed>0.1이면 Walk_Run, <=0.1이면 Idle로 돌아가는 실제 선택 상태 변화이다. 조건과 포즈 전환 블렌딩은 구분한다.

ENTRY · STATE · TRANSITION RULE

같은 Speed 경계의 두 방향 전환을 모두 연결합니다

지상 이동 예제는 XY 속도를 Speed에 저장합니다. Entry는 Idle을 선택하고, Speed가 0.1보다 크면 Walk_Run으로, 0.1 이하이면 Idle로 돌아갑니다.

Idle과WalkRun의두방향전환Entry는Idle로진입한다. Speed가0.1보다크면WalkRun, Speed가0.1이하이면Idle로전환한다. 두 화살표는 다른 방향의 전환 규칙이다.EntryIdleWalk_RunSpeed > 0.1Speed ≤ 0.1
Idle과WalkRun의두방향전환Entry는Idle로진입한다.왼쪽아래화살표는Speed>0.1일때Walk_Run으로,오른쪽위화살표는Speed≤0.1일때Idle로복귀한다.같은경계와두방향조건을유지한다.EntryIdleWalk_Run> 0.1≤ 0.1

Idle 상태 내부

Idle 시퀀스 플레이어를 Output Pose에 연결합니다.

Walk_Run 상태 내부

Blend Space Player가 Speed를 읽어 걷기·달리기 포즈를 섞고 Output Pose로 보냅니다.

선의 조건과 전환 블렌딩을 구분합니다

조건은 어느 상태로 이동할지 정합니다. Transition Duration·Blend Mode는 전환 때 포즈를 섞는 방식입니다. 경계에서 떨린다면 진입·복귀 임계값을 다르게 두는 설계를 검토합니다.

이 예의 조건

  • 본문과 원 도표에 제시된 사례의 입력·조건을 사용합니다. 설명용 수치나 독립 비교 경로는 각 단계에 표시합니다.
  • 현재 상태·값과 전환 근거의 위치는 모든 단계에서 같습니다. 조건이 맞지 않거나 실행되지 않은 경로를 성공한 동작으로 해석하지 않습니다.
관계도의 보충 설명
원 도표의 제목·노드·관계·조건·주석
범위원문
도표 제목Idle과 Walk_Run의 두 방향 전환
관계·조건 설명Entry는 Idle로 진입한다. Speed가 0.1보다 크면 Walk_Run으로, Speed가 0.1 이하이면 Idle로 전환한다. 두 화살표는 다른 방향의 전환 규칙이다.
관계·조건 설명Entry는 Idle로 진입한다. 왼쪽 아래 화살표는 Speed>0.1일 때 Walk_Run으로, 오른쪽 위 화살표는 Speed≤0.1일 때 Idle로 복귀한다. 같은 경계와 두 방향 조건을 유지한다.
예의 값과 변화
관찰·상황값·보충 정보변화·이유
Idle 시작

Entry 뒤 Idle 상태에서 Speed를 읽는다.

  • 상태: Idle
  • 조건: Speed>0.1
  • 조건 만족과 포즈 블렌딩은 별개 동작이다.
이동 상태

0.1보다 크면 Walk_Run으로 전환한다.

  • 상태: Walk_Run
  • 조건: Speed>0.1
  • 같은 Speed 값으로 전환 여부를 판단한다.
정지 복귀

0.1 이하에서 Idle로 돌아간다.

  • 상태: Idle
  • 조건: Speed<=0.1
  • 경계 0.1에서 돌아오는 조건을 빠뜨리지 않는다.

같은 Speed 경계의 두 방향 전환을 모두 연결합니다

Entry가 Idle로 진입한 뒤 Speed>0.1이면 Walk_Run, <=0.1이면 Idle로 돌아가는 실제 선택 상태 변화이다. 조건과 포즈 전환 블렌딩은 구분한다.

ENTRY · STATE · TRANSITION RULE

같은 Speed 경계의 두 방향 전환을 모두 연결합니다

지상 이동 예제는 XY 속도를 Speed에 저장합니다. Entry는 Idle을 선택하고, Speed가 0.1보다 크면 Walk_Run으로, 0.1 이하이면 Idle로 돌아갑니다.

Idle과WalkRun의두방향전환Entry는Idle로진입한다. Speed가0.1보다크면WalkRun, Speed가0.1이하이면Idle로전환한다. 두 화살표는 다른 방향의 전환 규칙이다.EntryIdleWalk_RunSpeed > 0.1Speed ≤ 0.1
Idle과WalkRun의두방향전환Entry는Idle로진입한다.왼쪽아래화살표는Speed>0.1일때Walk_Run으로,오른쪽위화살표는Speed≤0.1일때Idle로복귀한다.같은경계와두방향조건을유지한다.EntryIdleWalk_Run> 0.1≤ 0.1

Idle 상태 내부

Idle 시퀀스 플레이어를 Output Pose에 연결합니다.

Walk_Run 상태 내부

Blend Space Player가 Speed를 읽어 걷기·달리기 포즈를 섞고 Output Pose로 보냅니다.

선의 조건과 전환 블렌딩을 구분합니다

조건은 어느 상태로 이동할지 정합니다. Transition Duration·Blend Mode는 전환 때 포즈를 섞는 방식입니다. 경계에서 떨린다면 진입·복귀 임계값을 다르게 두는 설계를 검토합니다.

이 예의 조건

  • 본문과 원 도표에 제시된 사례의 입력·조건을 사용합니다. 설명용 수치나 독립 비교 경로는 각 단계에 표시합니다.
  • 현재 상태·값과 전환 근거의 위치는 모든 단계에서 같습니다. 조건이 맞지 않거나 실행되지 않은 경로를 성공한 동작으로 해석하지 않습니다.

관계도의 보충 설명

원 도표의 제목·노드·관계·조건·주석
범위원문
도표 제목Idle과 Walk_Run의 두 방향 전환
관계·조건 설명Entry는 Idle로 진입한다. Speed가 0.1보다 크면 Walk_Run으로, Speed가 0.1 이하이면 Idle로 전환한다. 두 화살표는 다른 방향의 전환 규칙이다.
관계·조건 설명Entry는 Idle로 진입한다. 왼쪽 아래 화살표는 Speed>0.1일 때 Walk_Run으로, 오른쪽 위 화살표는 Speed≤0.1일 때 Idle로 복귀한다. 같은 경계와 두 방향 조건을 유지한다.
예의 값과 변화
관찰·상황값·보충 정보변화·이유
Idle 시작

Entry 뒤 Idle 상태에서 Speed를 읽는다.

  • 상태: Idle
  • 조건: Speed>0.1
  • 조건 만족과 포즈 블렌딩은 별개 동작이다.
이동 상태

0.1보다 크면 Walk_Run으로 전환한다.

  • 상태: Walk_Run
  • 조건: Speed>0.1
  • 같은 Speed 값으로 전환 여부를 판단한다.
정지 복귀

0.1 이하에서 Idle로 돌아간다.

  • 상태: Idle
  • 조건: Speed<=0.1
  • 경계 0.1에서 돌아오는 조건을 빠뜨리지 않는다.

스테이트 머신 활용 시 고려사항

  • 상태 전환 블렌딩: 스테이트 머신은 기본적으로 상태 전환 시 두 애니메이션을 부드럽게 블렌딩합니다. 전환 규칙 선을 선택하고 디테일 패널에서 Transition Duration (전환 시간), Blend Mode, Blend Curve 등을 조절하여 블렌딩 방식을 세밀하게 제어할 수 있습니다.
  • 전환 우선순위: 여러 전환 규칙이 동시에 충족될 수 있는 경우, Transition Priority Order의 숫자가 낮은 전환이 우선합니다. 생성 순서에 의존하지 말고 값을 확인하거나, Conduit 노드를 사용하여 전환 로직을 단순화할 수 있습니다.
  • 콘딧 (Conduit): 여러 상태가 공통된 전환 규칙을 가질 때, 이 규칙을 한곳에 모아 관리할 수 있는 노드입니다. 스테이트 머신 그래프를 깔끔하게 유지하는 데 도움을 줍니다.
  • 캐시 포즈 (Cached Pose): 동일한 애니메이션 포즈를 여러 상태나 블렌딩 로직에서 재사용해야 할 때, 해당 포즈를 캐시 포즈로 저장해 두고 여러 곳에서 불러와 사용하면 성능 최적화와 가독성 향상에 도움이 됩니다.
  • 애님 노티파이 (Anim Notify): 애니메이션 재생 중 특정 프레임에서 이벤트를 발생시키는 기능입니다. (예: 발소리 재생, 무기 타격 지점 설정 등) 이는 애님 블루프린트의 이벤트 그래프에서 수신하여 게임플레이 로직을 트리거할 수 있습니다.

스테이트 머신은 캐릭터 애니메이션 흐름을 상태와 전환 규칙으로 나눠 관리하는 방식입니다.

이동, 점프, 공격처럼 조건이 분명한 애니메이션 전환에 자주 사용됩니다.