Unreal Engine/기능 구현 / / 2025. 10. 15. 17:47

[Unreal Engine 5] Blueprint : 애니메이션 블루프린트(1) : 이동

반응형

# 개요

언리얼에서 애니메이션은 크게 두 가지로 형태로 구분하여 구현한다.

1. 대기, 이동, 점프 및 하락과 같은 간단하고 연속적인 동작은 애니메이션 블루프린트(ABP Class)로

2. 공격, 스킬, 사망 등 특정 조건에 의해 일회성으로 발생하는 동작은 애니메이션 몽타주(Play AnimMontage 함수)로 구현한다.

 

 

애니메이션은 스켈레톤을 기반으로 구분된다.

 

스켈레톤은 본(뼈) 구조를 가지고 있고, 애니메이션은 특정 본들을 이동하고 회전시키며 애니메이션을 구현하는 원리다.

본 구조가 다르면 이상한 부위가 이동하고 회전하므로 팔이 비정상적으로 길어지거나 팔다리가 x자 형태로 크로스 되는 등 이상하게 동작한다.

 

이러한 문제로, 스켈레톤이 다르면 애니메이션을 다시 제작해야하는 문제를 해결하기 위해 언리얼에서는 리타게팅 이라는 기능을 제공한다. 

과거에는 리타게팅을 하기 위해선 본 구조를 하나하나 맞춰주는 작업이 필요했는데, 언리얼 버전이 올라가면서(5.4 ?) 자동으로 리타겟 해주는 기능이 추가되었다. 다만 100% 잘 동작하는 것은 아니다. 어느 정도 본 구조가 유사해야 한다.

그렇지 않으면 수작업으로 본 구조를 매칭시켜줘야 한다.

 

 

이 글에서는 애니메이션 블루프린트, 애님 인스턴스 클래스, 블렌드 스페이스에 대해서만 다루며 애님 몽타주와 리타게팅에 대해선 다루지 않는다.

 

 

 

1. 콘텐츠 드로어 우클릭 - 애니메이션 블루프린트 - 스켈레톤 클릭 후 생성

 

2. 스테이트 머신 생성

영어로 검색하면 찾는데 오래 걸리는데, 한글로 치면 바로 나온다.

 

스테이트 이름은 Locomotion(로코모션)으로 짓는다.

 

로코모션 스테이트 머신을 더블클릭하면 Entry(엔트리)가 있는데 여기에 연결해줄 애니메이션을 블렌드 스페이스를 통해 만든다.

 

블렌드 스페이스란, 여러 애니메이션을 섞어 하나의 자연스러운 애니메이션으로 만들어주는 기능으로 로코모션은 기본 상태인 Idle과 Walk, Run 상태 그리고 앞, 뒤, 좌, 우를 구분해줄 것이다.

 

 

 

3. 블렌드 스페이스 생성

애니메이션 블루프린트와 동일한 스켈레톤을 선택해야 한다.

 

 

좌측에 에셋 디테일에 가면 가로 축과 세로 축을 지정해줄 수 있는 기능이 있다.

여기서는 가로축은 방향, 세로축은 이동속도로 한다.

방향은 -180 ~ 180도까지. 이동속도는 캐릭터의 (Max)Velocity로 보면 되는데 언리얼 기본 이동속도가 500 ~ 600 정도니까 그 즈음으로 맞춘다. 0이면 이동하지 않는 상태니까 0부터 적당한 값으로 지정한다.

 

그리드에 스냅 버튼은 선택사항인데, 활성화하면 특정 구간에 애니메이션을 배치할 때 자석에 붙듯이 깔끔하게 배치할 수 있다.

 

하단에 다음과 같이 나온다.

 

이에 맞춰서 애니메이션을 넣어준다.

 

사각형 틀 안에 초록색 X자 표시는 해당 구간에서 애니메이션이 어떻게 블렌드되어 보여질 것인지를 확인할 수 있는 기능으로

Ctrl키를 누른 상태에서 마우스 드래그하면 해당 구간의 애니메이션을 확인할 수 있다.

 

 

 

4. 블렌드 스페이스에 애니메이션 배치

4-1. Idle

먼저 방향과 관계없이 Speed가 0인 가로축 구간에 모두 Idle 애니메이션을 배치한다. 

드래그 앤 드랍

 

 

4-2-1. Walk / Forward

Speed의 중간, Direction의 중앙에는 Walk 면서 Forward 를 배치한다.

 

Walk 또는 Run 둘 중 하나만 존재하면 4-2 항목까지만 따라한다.

 

 

4-2-2. Walk / Left

Direction의 -90도 구간에 Walk_Left를 배치한다.

 

 

4-2-3. Walk / Right

Direction의 90도 구간에 Walk_Right를 배치한다.

 

4-2-4. Walk / Back

마지막으로 Direction의 -180도와 180도 구간 양쪽에 Walk_Back을 배치한다.

 

 

확인

 

 

이와 같은 방법으로 Speed 맨 윗칸을 Run으로 채운다.

Walk 또는 Run 둘 중 하나만 존재하면 4-3 항목은 생략한다.

 

4-3. Run / Forward, Left, Right, Back

 

 

-90도가 Left,

+90도는 Right

 

 

-180도와 +180도 모두 Back

 

 

최종 결과물은 아래와 같다.

 

Ctrl + 마우스 드래그를 통해서 이리저리 옮길 때 마다 애니메이션이 자연스럽게 변화한다.

 

이제 블렌드 스페이스를 애니메이션 블루프린트에 연결하는 작업을 한다.

 

 

5. 애니메이션 블루프린트 -  Locomotion 스테이트 머신 클릭 - 블렌드 스페이스 드래그 앤 드랍

 

 

블렌드 스페이스를 더블클릭하면 내부로 들어갈 수 있다.

 

그러면 애니메이션 블루프린트에서 물어본다.

"Direction과 Speed가 뭔데?"

 

이걸 지정해주는 방법은 두 가지가 있다.

1. 애니메이션 블루프린트의 이벤트 그래프를 활용하는 방법

2. C++ 코드를 통해 Anim Instance 클래스를 상속받아 처리하는 방법

 

결론부터 말하면, 캐릭터 클래스의 캐릭터 무브먼트 컴포넌트(Character Movement Component)의 데이터를 가져와 변수로 저장하는 것이 핵심이다.

 

구현 과정은 C++ 코드가 더 간결하다.

블루프린트로는 간단히 구현해보겠다.

 

6-1. 블루프린트로 Direction과 Speed 가져오기

이벤트 그래프로 간다.

 

6-1-1. Event Initialize Animation

Initialize Animation 이벤트를 생성한 뒤, Get Owning Actor를 캐스팅하여 캐릭터로 변환한다.

캐릭터 클래스부터 캐릭터 무브먼트 컴포넌트가 존재하기 때문이다.

 

As 캐릭터 파라미터를 드래그해서 Get Character Movement

 

캐릭터 무브먼트를 변수로 승격

 

그러면 이제 캐릭터 무브먼트를 항상 가져와서 쓸 수 있다.

 

그러면 초기화 단계에서 역할은 끝났다.

 

 

6-2-2. Event Update Animation

여러 작업을 해야하므로 시퀀스 추가

한글로 검색해야 바로 나온다. 영어로 찾는건...

 

Update에서 할 작업은 5가지 변수 값을 가져오는 것이다.

1. Velocity : 이동 값을 가지고 있는 벡터

2. Speed : Velocity라는 벡터의 길이(Size2D = x,y 길이, 점프 무시)

3. Direction : 방향

4. bShouldMove : 이동 중?

5. bFalling : 낙하 중? 땅에 안 닿음?

 

 

6-2-3. Velocity

변수로 저장한 캐릭터 무브먼트를 Get으로 가져와서 Get Velocity를 찾는다. 

빈 이벤트 그래프에서 검색하면 안 나온다. 반드시 캐릭터 무브먼트를 가져오자.

 

Velocity도 쓸거니까 변수로 승격

 

 

 

6-2-3. Speed

변수로 저장한 Velocity를 가져와서 Length XY를 가져온 뒤 변수로 승격

 

변수 이름은 Speed로 변경

 

 

6-2-4. Direction

Calculate Direction 함수 추가

 

저장해두었던 Velocity와 Get Owning Actor의 Get Actor Rotation 을 통해 회전 값을 넣어주면 반환되는 값이 방향

 

 

6-2-5. bShould Speed

이동 중인지 알 수 있는 방법은 간단하다.

Speed가 0이 아니면 이동 중 아닌가?

 

한가지 더, 현재 속도가 0이 아닌가?

"!=" 또는 Not Equal을 검색하면 세번째 노드를 가져올 수 있다.

 

 

스피드가 3.0보다 크고 캐릭터 무브먼트 컴포넌트의 Get Current Acceleration이 0이 아니면 이동 중이다.

 

 

6-2-6. bFalling

마지막으로 낙하 중인지 어떻게 아느냐?

언리얼은 점프와 관련된 기능을 그냥 제공하고 있다.

캐릭터 무브먼트 컴포넌트야, Is Falling?

 

변수는 다음과 같다.

 

 

7. 블루프린트 애니메이션 - 애님 그래프 - Locomotion 스테이트 머신 - BS로 이동

이벤트 그래프에서 변수로 저장한 Direction과 Speed를 넣어준다.

 

컴파일하면 

 

이렇게 바뀌는데 확인하면

 

아주 잘 동작한다.

반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유