나만의 작은 도서관
[TIL][C++] 251014 MMO 서버 개발 114일차: [언리얼] AnimClass에 대해 (Idle, Move 애니메이션 적용) 본문
Today I Learn
[TIL][C++] 251014 MMO 서버 개발 114일차: [언리얼] AnimClass에 대해 (Idle, Move 애니메이션 적용)
pledge24 2025. 10. 14. 22:55주의사항: 해당 글은 일기와 같은 기록용으로, 다듬지 않은 날것 그대로인 글입니다.
[언리얼] AnimClass에 대해
- AnimClass는 캐릭터의 애니메이션을 담당하는 클래스로, 캐릭터의 로직과 독립적으로 실행되며 블루프린트로 만들어진다. 그래서 이름을 지을 때 prefix로 ABP(Animation BluePrint)가 붙는다. (ex. ABP_Player)
- AnimClass는 SkeletalMeshComponent에서 넣을 수 있으며, 캐릭터 액터의 경우, AnimClass를 넣을 때 여기에 넣는다.
ABP의 구성
- ABP의 구성은 크게 2가지로, 1) AnimGraph와 2) EventGraph로 구성되어 있다.
- EventGraph는 플레이어 캐릭터에서 필요한 정보를 수집하는 역할을 하며,
- AnimGraph는 EventGraph에서 수집한 데이터를 통해 실제로 어떤 애니메이션을 출력할 것인지 결정한다.
AnimGraph를 초기 모습
- AnimGraph을 처음 들어가면 Output Pose 하나만 존재하는 것을 볼 수 있다. OuputPose 노드는 레벨에 재생될 최종 애니메이션을 입력받는다.
- Output Pose이 받은 데이터는 “한 프레임 포즈”이다. 즉, 애니메이션 자체를 넘겨받는 것이 아니므로, 매 프레임(Tick)마다 캐릭터의 현재 자세를 입력해 주는 방식으로 진행된다.

Asset Browser탭

- 에디터에서 ABP를 열고 오른쪽 아래를 보면 Asset Browser 탭이 있다. 이 탭은 현재 프로젝트에 존재하는 모든 애니메이션 파일들을 리스트 형식으로 보여준다.
- 이름 컨벤션으로 MF, MM이 있는데, 각각 MF prefix는 여성형, MM prefix는 남성형을 의미한다.
Idle 애니메이션 적용해 보기

- Asset Browser에서 애니메이션 파일을 Event Graph에 Drag&Drop 하면 해당 애니메이션 노드가 생성된다. Idle 애니메이션을 찾아 Drag&Drop으로 노드를 생성해준다음, Output Pose와 연결한다.
Loop Animation 옵션

- Idle 애니메이션의 경우, 한 번 재생되고 끝! 이 아니다. 서있는 동안 반복적으로 수행되어야 하므로, 이에 맞는 옵션을 체크해줘야 한다. 옵션 이름은 Loop Animation이다. (디테일 패널에 있음)
Move 애니메이션 적용하기
- Move의 경우, Idle과 달리 “캐릭터가 이동하고 있음”에 대한 정보가 필요하다. 따라서, 플레이어 캐릭터의 데이터를 수집하는 영역인 1) Event Graph에서 이동 데이터를 수집하는 로직을 추가하고, 2) 이를 Anim Graph에 적용해야 한다.
Event Graph에서 이동 데이터를 수집하기 첫 번째 - 변수 가져오기

- Event Bluprint Initialize Animation 노드
- 이 노드는 ABP가 시작되었을 때 한 번만 실행되는 노드이며, 데이터 수집의 첫 번째 단계이다.
- 대충 BeginPlay와 비슷한 역할이다.
- Get Owning Actor 노드를 연결
- Get Owning Actor 노드를 연결해서 이 ABP를 소유하고 있는 Actor 클래스를 가져온다.
- (참고로, 노드에서 반환된 값을 “Promote to Variable”을 통해 BP 변수로 꽂아 넣을 수 있다.)
- Chracter Movement 컴포넌트 가져오기
- 움직임을 담당하는 컴포넌트인 Character Movement 컴포넌트를 가져온다. Character Movement는 현재 캐릭터의 이동 속도, 가속도 등 이동에 대한 데이터를 읽어올 때 사용된다.
Event Graph에서 이동 데이터를 수집하기 두 번째 - 틱마다 데이터 수집하기

Event Blueprint Update Animation
- 이 노드는 매 틱마다 매 프레임마다 호출이 되는 노드.
- 매 프레임에 데이터를 수집하기 위해 사용한다.
위 로직에 대한 설명
Then0:
- CMC(Character Movement Component)에서 캐릭터 속도(Velocity)를 가져온다. 반환값은 Vector이므로 3축.
- XY 축 정보만 가져와서 평면 이동 속도를 세팅한다.(Z가 높이이니, XY 벡터 정보는 평면 이동 속도를 의미한다.)
Then1:
- CMC에서 캐릭터 가속도(Acceleration)를 가져온다. 반환값은 Vector.
- 위 로직에선 캐릭터 속도가 최소 속도 이상(3)이고, 가속도가 있다면 ⇒ Move로 판단. 그 외인 경우 Move가 아님으로 판단.
Then2:
- CMC에서 캐릭터가 떨어지는 상태인지 가져온다(CMC에 함수로 있음). 반환값은 bool
- 반환값을 변수에 저장해서 떨어지는 상태를 세팅한다.
애니메이션 전환을 위한 상태 변환 감지 → State Machine
- Idle 애니메이션에서 Move 애니메이션으로 바뀌기 위해서는 State Machine이 필요하다.
State Machine이란?

- State Machine은 재생할 수 있는 특정 애니메이션과 해당 애니메이션의 재생이 허용되는 시기를 ABP에서 빌드할 수 있는 “모듈형 시스템”이다.
- StateMachine의 반환값 또한 Pose이므로, Output Pose와 곧바로 연결할 수 있다.

State Machine 처음 진입 시 - 엔트리 포인트
- Entry 노드가 딸랑 하나 존재하게 된다. 언리얼에선 이를 “엔트리 포인트”라고 부르며, 모든 State Machine은 엔트리 포인트로 시작한다.
- 일반적으로 엔트리 포인트는 기본 상태를 정의하는 데 사용된다.
캐릭터 상태를 표현하는 State
- State는 State Machine 내에 구성된 서브섹션으로, 각 State는 하나 또는 여러 개의 애니메이션 조합의 결과를 Output Animation Pose로 뱉어낸다. 이렇게 뱉어진 Pose는 StateMachine의 반환값이 된다.
- State는 노드로 표현되는데, 각각의 State 노드는 고유한 Anim Graph가 있으며, 모든 종류의 애니메이션 로직을 사용할 수 있다.
- State 노드는 Anim Graph에서 “Add State…”로 만들거나, Asset Browser에서 애니메이션 파일을 드래그 앤 드롭해서 만들 수 있다.


- State 노드는 왼쪽 아래 그림처럼 생겼으며, State 노드를 더블 클릭해 안으로 들어가 보면 오른쪽 아래 그림과 같이 애니메이션 노드가 곧바로 State Machine의 Output Animation Pose에 연결되어 있는 것을 볼 수 있다.

State를 바꾸는 트랜지션(Transition)
- 트랜지션은 State를 바꿀 때 사용하는 기능으로, State 간 전환 조건을 붙여 해당 조건을 만족했을 때 자동으로 State를 전환되도록 한다. Idle → Walk처럼 상태를 바꿀 때 사용한다.
- 트랜지션은 화살표 모양으로 생겼으며, State 노드를 클릭한 다음 잡아끌어 다른 State 노드에 붙여 생성한다. 원으로 된 아이콘을 더블 클릭하면 전환 조건을 설정할 수 있는 그래프가 나타난다. 여기서 조건을 설정하면 된다.


복잡한 트랜지션을 깔끔하게 바꿔주는 State Alias
- State 간 복잡한 트랜지션이 존재하는 경우, State Alias를 사용하면 그래프가 훨씬 간단하게 표현된다. State Alias의 역할은 “바로가기”로, 다른 노드로 워프가 가능하다.
- State Alias를 활용하면 외딴섬 마냥 엔트리 포인트와 직접적으로 연결된 부분이 없는 그래프를 만들어도 해당 그래프로 이동할 수 있게 되는데, 언리얼의 예제 템플릿인 TPS에서는 아래와 같이 사용하고 있다.(왼쪽은 사용 전, 오른쪽은 사용 후)


State Alias의 작동 방식
- State Alias는 트랜지션 할 수 있는 State를 정의한 다음, 노멀 트랜지션 메서드를 사용하여 Alias를 다른 State 노드에 연결하는 방식으로 작동한다.
- State Alias를 생성하면(그래프에서 마우스 오른쪽 클릭 → Add State Alias로 생성), 아래와 같이 생긴 노드가 만들어지고, 이 노드를 클릭해 디테일 패널을 확인해 보면 내가 지금까지 이 그래프에 만들어둔 State 노드들이 표시된다.

- 여기에 표시된 State 노드 이름의 체크박스를 체크하면, 해당 State 노드가 State Alias로 워프 할 수 있게 된다. 즉, State Alias에 트랜지션과 조건을 달아둔 상태에서 해당 State 노드가 조건을 만족한다면 State Alias으로 이동하여 트랜지션이 이루어진다는 것이다.
- (여기서 잠깐 짚고 넘어가자면, State Alias자체는 애니메이션이 없다는 것이다. 단순 이동 수단이기 때문에 Alias 노드에서 상태가 결정되거나 하지는 않는다.)
애니메이션 블렌딩
- 애니메이션 블렌딩(Blending)이란?
- 캐릭터의 상태(Idle, Walk, Run)가 바뀔 때 애니메이션이 부드럽게 전환되도록 하는 기술
- 예: 가만히 서 있는(Idle) 상태에서 걷기(Walk) 상태로 전환될 때 중간 동작을 자연스럽게 섞어주는 것.
- 블렌드 스페이스 (Blend Space):
- 캐릭터의 속도(Speed)나 방향(Direction) 같은 여러 입력값에 따라 다양한 이동 애니메이션을 실시간으로 혼합하여 재생하는 데 사용되는 에셋.
블랜드 스페이스를 출력 애니메이션으로 사용하는 예제

Locomotion이란?
- Locomotion은 이동과 관련된 전반적인 움직임을 통칭하는 용어.
- 걷기, 달리기, 점프, 웅크리기가 여기에 해당됨.
Transition BlendSpace

- Transition의 양쪽 화살표 표식이 있는 원을 클릭해 보면 디테일 패널에 이런 게 뜨는데, 여기서 Duration초만큼 전환 시 애니메이션을 섞어서 변환해 준다. 애니메이션을 섞어주는 작업 자체는 언리얼이 자동으로 해준다.
