2-4. State Machine 설계를 통한 캐릭터 동작 애니메이션 적용하기
1. 애니메이션 블루프린트 이해하기
애니메이션 블루프린트 (Anim Blueprint)
- 언리얼 엔진에서 캐릭터의 골격(스켈레톤) 기반 애니메이션을 시각적으로 설계하는 데 특화된 전용 Blueprint
- 캐릭터의 골격 움직임과 모션 전이(Transition) 등을 그래프나 State Machine을 통해 손쉽게 구현하도록 도움
- 보통은 스켈레탈 메시, 애니메이션 시퀀스, State Machine 등을 연결하는 역할을 함
- 캐릭터가 점프하거나 Idle 동작 등을 매끄럽게 전환시키는 다양한 로직을 담게 됨
애니메이션 블루프린트 생성
Content Browser 우클릭 → Animations → Animation Blueprint 선택
스켈레톤 (Skeleton)과 부모 클래스를 선택
새 애니메이션 블루프린트 이름 설정 (예시: ABP_Sparta)

Anim Graph & Event Graph
Anim Graph (애니메이션 그래프)
- 입력 노드 → 블렌딩 (Blend) → 출력 노드 (Output Pose)순으로 최종적으로 캐릭터가 어떤 포즈와 애니메이션을 취할지 결정
Event Graph (이벤트 그래프)
- Tick 이벤트 BlueprintImplementableEvent 등을 활용해 C++ 혹은 게임 로직과 애니메이션을 연동
Preview Scene Settings
- Mesh → 작업했던 Mesh 선택 → Apply To Asset
애니메이션 연결 (Output Pose 테스트)
Asset Browser 에서 프로젝트에 들어 있는 다양한 애니메이션 시퀀스를 확인 가능함

Anim Graph 창
Output Pose 노드 MM_Idle 애니메이션 시퀀스 연결
→ 캐릭터가 Idle 애니메이션을 출력

MM_Idle 선택 → Details → Loop Animation 체크 → Idle 동작이 지속적으로 반복 재생

캐릭터 클래스에 애니메이션 블루프린트 적용
BP_SpartaCharacter → Mesh 컴포넌트를 선택 Details → Animation 항목
- Animation Mode를 Use Animation Blueprint 로 설정
- Anim Class를 ABP_Sparta 를 할당

2. 이벤트 그래프에서 Movement Component 정보 받아오기
캐릭터 Movement Component 변수화
Movement Component
캐릭터의 이동 속도, 가속도, 점프, 낙하 여부 등 다양한 이동 관련 정보를 제공
애니메이션 블루프린트와 캐릭터를 연동해, 캐릭터의 이동 상태에 따라 다른 애니메이션을 재생하기 위해서는
Movement Component의 정보가 필수적
Event Graph에서 변수 2가지 추가
Character / 타입: Character Object Reference
CharacterMovement / 타입: Character Movement Component Object Reference

Event BlueprintInitializeAnimation
애니메이션 블루프린트가 초기화될 때 실행되는 이벤트 (한 번만 호출)
Get Owning Actor
현재 애니메이션을 재생 중인 액를 가져옴 (BP_SpartaCharacter)
Cast to BP_SpartaCharacter
캐스팅을 통해 사용 중인 캐릭터가 맞는지 확인, 성공하면 해당 객체를 Character 변수에 저장
Character에서 Get Character Movement 노드를 사용해 Movement Component를 얻음
이를 CharacterMovement 변수에 저장

매 프레임마다 캐릭터의 수평 속도 가져오기
Event BlueprintUpdateAnimation
프레임마다 호출되어 애니메이션 로직을 업데이트하는 핵심 이벤트
캐릭터의 현재 이동 속도, 가속도 등을 매번 체크하여 Anim Graph 에서 참조할 변수를 계속 갱신
Valid 체크

Character가 유효한지 (Null이 아닌지) Is Valid? 노드 등을 통해 확인

Ground Speed 계산

Get Velocity
캐릭터의 현재 속도 벡터(X, Y, Z)를 가져옴
Vector Length XY
X, Y 성분의 길이(즉, 2D 평면상의 속도)만 구함 → Ground Speed 라는 float 변수에 저장
캐릭터가 수평으로 어느 정도 빠르게 움직이고 있는지 알 수 있게 됨
전체 속도 벡터는 Velocity라는 Vector 변수에 저장 → 점프 중인 경우, Z축 속도를 확인해야 하는 상황 등이 있을 수 있음

매 프레임마다 캐릭터의 움직임 여부 저장하기
캐릭터가 Idle 상태인지, Walk/Run 상태인지를 구분하는 기본적인 로직을 구현

Ground Speed가 어느 정도 이상이면 (3.0f 이상) 캐릭터가 움직이고 있다고 판단할 수 있음
CharacterMovement 의 Get Current Acceleration 노드로 현재 가속도 값을 가져올 수도 있음
가속도 벡터가 (0, 0, 0)에 가깝다면, 입력 중이 아닌 상태일 수 있음

이동 여부와 사용자 입력을 AND 조건 등으로 조합 → 캐릭터가 실제로 이동 중인지를 판정하는 변수를 만들어 둘 수 있음
IsMoving = (Ground Speed > 3.0) AND (Acceleration != 0)
매 프레임마다 캐릭터의 낙하 여부 저장하기

- CharacterMovement의 Is Falling 함수를 사용해 캐릭터가 공중에 떠 있는지 확인
- 캐릭터가 지면에 붙어있지 않으면 True가 반환
- 이를 bool 변수에 저장하면, Anim Graph 내에서 캐릭터가 점프나 낙하 관련 애니메이션으로 전환하도록 제어 가능

3. 애님 그래프에서 “Locomotion” State Machine 설계하기
State Machine
언리얼 엔진의 애니메이션 시스템에서
캐릭터의 상태에 따라 어떤 애니메이션을 재생, 어떻게 전환할지를 결정하기 위한 논리적 구조
예시: Idle 상태 → Idle 애니메이션 재생
로직을 직관적으로 구성해줌
“Locomotion” State Machine 생성
Anim Graph 창에서 우클릭 → Add New State Machine 선택 → 이름 설정(Locomotion)
State Machine 안에 들어가면 Entry 노드만 있음

Idle State 생성
Add State → 이름 설정 (Idle)
Idle State → MM_Idle 시퀀스를 연결
MM_Idle 시퀀스가 반복 재생을 위해 Details → Loop Animation 옵션 체크

Walk/Run State 생성
Add State → 이름 설정 (Walk/Run)
Walk/Run State → Blend Space(BS_MM_WalkRun) 연결
Blend Space: 캐릭터 속도(Ground Speed)를 입력으로 받아 걷기, 달리기 애니메이션을 부드럽게 혼합하여 재생

Idle ↔ Walk/Run 전환 조건 설정
Idle에서 Walk/Run으로 가는 화살표 더블 클릭 → Transition Rule 설정 창이 열림

Idle → Walk/Run
캐릭터가 이동 입력을 받고 있음을 의미

Walk/Run → Idle
bShouldMove == false

4. 애님 그래프에서 “Main States” State Machine 설계하기
State Machine 생성과 Control Rig 설정
점프, 낙하, 착지와 같은 추가 상태들을 포함하기 위한 상위 State Machine을 설계
Add New State Machine → 이름 설정 (Main States)

Control Rig 설정
애니메이션 로직 (상태머신)에서 나온 포즈를 한 번 더 가공하거나,
Foot IK (지형이 울퉁불퉁해도 발을 지면에 맞추는 기능) 같은 것을 적용하기 위해 사용
Set Initial Trnsforms From Mesh 옵션 체크
- 현재 스켈레탈 메쉬 (Anim Graph에서 넘어온 포즈)의 뼈 변환을 그대로 초기값으로 사용하겠다는 의미
Input, Output 카테고리 ShouldDoIKTrace - Use Pin에 체크
- 실제로 발 위치를 추적 (Trace)할 것인지를 결정
- Use Pin 에 체크 → 이 값이 Anim Graph나 Blueprint에서 핀으로 연결 가능
- 캐릭터가 공중에 있을 때 Foot IK 미사용, 지면 위에서만 Foot IK 사용 등 조건에 따라 사용 가능
Control Rig Calss
CR_Mannequin_BasicFootIK 로 지정 (프로젝트에 존재하는 IK용 Control Rig 에셋)

IK의 역할
관절뼈들의 계산을 해줌
Control Rig의 역할
IK의 계산값에 따라서 실제로 캐릭터를 움직여줌
Locomotion / State Machine을 캐시 포즈로 저장
- 기존에 만든 Locomotion State Machine (Idle, Walk/Run 동작) 을 캐시 포즈로 만들면 재활용하기 쉬움
- New Save cached pose → 이름 설정 (Locomotion)
- Main States에서 Locomotion 상태를 하나의 포즈로 쉽게 가져와 사용 가능함

Main States / State Machine 설계

1. Locomotion (걷기/뛰기) State
- Locomotion State를 더블 클릭 후 들어가기
- 캐시 포즈로 저장한 Locomotion 포즈 연결
- Locomotion에 설정했던 것들이 Output으로 들어감

2. Land (착륙) State
MM_Land → Details → Loop Animation 조건 체크
Loop Animation을 키는 이유
블렌딩 시간 확보 및 부자연스러움 방지
- 블렌딩 시간이 확보되지 않으면 다음 동작이 부자연스러울 수 있음
반복 동작 연출 (예시: 숨을 몰아쉬거나 자세를 유지하는 구간)
- 착륙 후 무릎을 굽히고 일어서기 전까지의 특정 구간을 루프시키는 것은 자연스러운 연출에 도움이 됨
- 루프 구간(Looping Point)이 매끄럽지 않으면(Pose Matching 실패) 오히려 뚝뚝 끊기는 느낌을 줄 수 있음
- 루프 지점의 프레임 정합성을 잘 맞추는 것이 핵심
상태 전환 버그 예방 (정지 상태 방지)
- 네트워크가 불안정하거나 로직 오류로 인해 착륙 이후의 다음 상태로 Transition 조건이 만족되지 않으면,
- 루프가 꺼져 있으면 애니메이션이 마지막 프레임에 멈춰서 정지된 것처럼 보일 수 있음
네트워크 지연 문제
- 서버로부터 다음 동작에 대한 패킷이 늦게 올 경우
- 루프가 걸려 있다면 → 캐릭터는 착륙 자세를 자연스럽게 유지하며 데이터를 기다림
- 루프가 없으면 → 애니메이션이 강제로 종료되어 캐릭터가 순간적으로 멈추거나 이상한 자세로 고정되어버림

전환 조건 (Transition 설정)
Land에서 Locomotion으로 가는 전환 조건을 2개를 설정해야함 (두번 드래그하면 두 개의 조건이 생성)
Land → Locomotion 첫 번째 조건
bShouldMove == true

Land → Locomotion 두 번째 조건
Details → Automatic Rule Based on Sequence Player in State 체크
애니메이션 시퀀스 재생 완료하면 자동으로 State가 변할 수 있는 조건

3. Fall Loop (추락) State
MM_Fall_Loop 애니메이션 적용
Loop Animation을 체크

4. Jump (점프) State
MM_Jump 애니메이션 적용
Loop Animation을 체크 X

전환 조건
Jump → Fall Loop

Details → Automatic Rule Based on Sequence Player in State 체크
(Jump 시퀀스가 끝나면 자동으로 Fall Loop로 전환되게끔)
5. State Alias 생성 - To Land (공중에 있는 = 지면으로 향하는) 그룹
우클릭 → Add State Alias를 통해 특정 스테이트들을 그룹 지어 별칭을 지을 수 있음
Jump, Fall Loop 두 상태를 To Land State 그룹으로 묶

전환 조건
To Land → Land
bIsFalling == false가 되면 Land로 전환하도록 설정
(공중에서 착지로 상태 전환을 해야하는 상황)

6. State Alias 생성 - To Falling (지면에 있는 = 공중으로 향하는) 그룹
우클릭 → Add State Alias
Locomotion, Land 두 상태를 To Falling State 그룹으로 묶기

전환 조건
To Falling → Jump

Movement Data → Velocity → Split Struct Pin
To Falling → Jump : Z축 속도가 일정 값(예: 100) 이상이고, bIsFalling == true 라면 점프 상태로 인식

전환 조건
To Falling → Fall Loop

바닥에서 공중으로 전환되는 상황

점프 애니메이션, 추락하는 애니메이션, 랜딩 애니메이션까지 정상 작동되는지 테스트
'C++와 Unreal Engine으로 3D 게임 개발' 카테고리의 다른 글
| C++와 Unreal Engine으로 3D 게임 개발 3-2 (0) | 2026.06.19 |
|---|---|
| C++와 Unreal Engine으로 3D 게임 개발 3-1 (0) | 2026.06.18 |
| C++와 Unreal Engine으로 3D 게임 개발 2-3 (0) | 2026.06.10 |
| C++와 Unreal Engine으로 3D 게임 개발 2-2 (0) | 2026.06.10 |
| C++와 Unreal Engine으로 3D 게임 개발 2-1 (0) | 2026.06.10 |