Unreal Engine 5 애니메이션

조정원·2025년 5월 22일
post-thumbnail

TIL(Today I Learned)

원래는 Advanced Locomotion Sytem 으로 공부하려 했는데 아직 애니메이션 부분이 부족한 것 같아 더 공부하고 넘어가려고 한다. 애니메이션은 전에 했었던 삼인칭 템플릿을 다시 살펴보았다.
막상 만들어보니 생각보다 만져야할 부분도 많고, 모르는 부분도 많은데 심지어 더 깊은 내용도 훨씬 많았다.
애니메이션에 들어가기 전, 이전에는 클래스를 블루프린트 전용 네이밍 규칙들을 지키지 않고 만들었는데 이를 수정해주었다.


식별용 접두사 뒤에 이름을 붙여주어야 한다. 블루프린트(BP)나 입력액션(IA) 등을 앞에 붙여주었다.

애니메이션은 기본적으로 애니메이션 블루프린트를 만들어주고 대부분을 여기서 처리한다.

가장 중요하게 다루어야할 부분은 애니메이션 블루프린트의 이벤트 그래프와 애니메이션 그래프다.

이벤트 그래프는 변수 계산 및 로직 처리를 한다.
속도나 점프 중인지 등을 계산하여 변수에 저장을 하고 게임의 로직과 상호작용하는 부분이 이벤트 그래프다.

애니메이션 그래프는 이벤트 그래프에서 만든 변수들을 활용하여 애니메이션을 출력한다. 주로 스테이트 머신을 사용해서 상태 전이 구조를 만든다.
예를 들어:

  • Idle 상태에서 시작하여
  • 일정 속도 이상이면 걷기나 뛰기로 전이하고
  • 점프 변수가 true일 때는 점프 애니메이션으로 전환하는 등 각 상태에 맞는 애니메이션을 재생한다.

먼저 다음과 같은 변수들을 선언한다.
이 변수들을 보며 예상을 해보면 애니메이션을 동작할 캐릭터 클래스와 컴포넌트에서 이 캐릭터의 상태에 대한 정보를 가져온 후 그것을 변수에 저장한다고 생각해 볼 수 있다.

이벤트 그래프를 먼저 만들어보면

Event BlueprintInitializeAnimation 노드는 애니메이션 블루프린트를 초기화할 때 호출되는 이벤트이다. 이 이벤트를 불러와서 Get Owning Actor 노드를 사용해 이 블루프린트를 소유한 액터의 캐릭터를 먼저 가져오고, 캐릭터로부터 무브먼트 컴포넌트를 가져와 준다.


다음 이벤트로 Event BlueprintUpdateAnimation을 호출한다. 이것은 매 프레임마다 실행되어 필요한 값을 계산하고 업데이트한다. 그리고 character를 get으로 생성하고 검증된 Get으로 변환하여 캐릭터가 월드에 존재할 때만 계산하도록 한다.
이제 Sequence로 세 가지를 순차적으로 계산한다.
먼저 무브먼트 컴포넌트로 속도를 가져온 후, 속도 벡터의 X와 Y 값으로 속도의 크기를 계산한다.

두 번째로는 ShouldMove 변수를 설정하기 위해 두 가지를 비교한다. 속도가 작은 임계값 이상일 때와 가속도 벡터가 0이 아닐 때로 비교하고 둘 다 만족할 때 true를 넘겨준다.

마지막은 Isfalling으로 떨어지고 있는 상태인지를 체크한다.

이제 애니메이션 그래프로 넘어가서

상태머신을 만들어주고 Output Pose에 연결해준다.
상태머신을 더블클릭하면 다시 그래프를 만들 수 있다.
Entry는 상태머신이 실행 될 때 처음으로 진입하는 상태이다. 그리고 연결된 상태를 상태전이 규칙에 따라 상태가 변화할 수 있다.
여기서는 상태를 두 개 Idle과 Walk/Run을 추가한다. Walk/Run은 블렌드 스페이스로 세 가지 애니메이션을 블렌드하여 사용할 것이다.

애니메이션을 상태에 추가하는 방법은 왼쪽 하단의 에셋 브라우저에서 적용할 애니메이션을 드래그해서 상태에 놓거나 상태를 더블클릭해서 출력 포즈에 연결해주면 된다.

Walk/Run을 위해 컨텐츠 브라우저에서 블렌더 스페이스를 만들었다.
블렌드 스페이스는 여러 개의 애니메이션을 부드럽게 섞어서 하나의 연속적인 동작을 만들어주는 시스템이다.
주로 캐릭터의 속도나 방향에 따라 걷기, 달리기, 멈춤 등의 동작을 자연스럽게 연결할 때 사용한다.


위와 같은 화면이 나오는데 가로 축을 Speed로 두고 최대 축 값을 500으로 한 뒤 세 가지 애니메이션 Walk_InPlace, Walk, Run을 0, 250 500 위치에 각각 넣어주었다.
그리고 다시 스테이트 머신의 Walk/Run 상태로 돌아가 speed 변수와 블렌더 스페이스를 연결하고 출력은 ouput pose와 연결한다.

그리고 Idle과 Walk/Run을 서로 연결한 뒤 transition 규칙을 넣어준다.

Idle에서 Walk/Run은 shouldmove 변수를 연결하고 반대는 shouldmove 변수와 not을 연결해 준다.

그리고 캐릭터 블루프린트에서 애니메이션을 내가 만든 애니메이션 블루프린트로 변경해준다.

여기까지 하면 걷고 달리는 애니메이션을 할 수 있다.

다음으로 점프 애니메이션을 넣어보겠다.
더 복잡한 상태 전이를 만들어야 하기 때문에 메인이 될 새로운 스테이트 머신을 만들어야 한다.
그 전에, Locomotion state machine은 new save cached pose 노드와 연결해준다. 이름은 Locomotion으로 해주었다.

save cached pose는 애님 그래프에서 계산한 포즈를 저장해 두었다가 다시 재사용할 수 있도록 해준다. 이렇게 하면 그래프를 더 단순하게 표현할 수 있다.

다음 스테이트 머신을 더블클릭해서 다음과 같은 그래프를 만들었다.
먼저 엔트리에서는 Locomotion으로 연결해주고 Locomotion으로 연결되는 상태는 Land이다.

Locomotion상태에는 방금 만든 cahed pose를 불러와서 연결해준다.

이제 다음과 같은 그래프를 추가로 만들어준다.

이제 Land, Jump Fall Loop 각각에 맞는 애니메이션 시퀀스를 넣어준다.

그리고 컴파일을 누르면 작동은 하지만 경고가 나오는데

이것은 화살표 중간에 위치한 원형 아이콘, 즉 전이 규칙을 설정해야 하기 때문이다. 경고가 발생하는 이유는, 현재 상태에서 다른 상태로 전환하기 위한 조건이 존재하지 않으면 애니메이션이 루프에 빠져 같은 행동을 반복하게 된다.

다음 설명에 앞서 상태 에일리어스에 대한 설명이 필요하다. 테두리가 보라색인 노드가 상태 에일리어스이다. 이것은 상태 표현을 간소화할 수 있는 기능을 제공한다.
언리얼 공식 문서의 이미지를 보면

여러 스테이트에서 하나의 스테이트로 전이된다고 할 때 이것을 스테이트 에일리어스로 묶어서 관리할 수 있다.
아래 그림 처럼 여러 상태 이름들이 있고 전이할 상태를 선택해주면 된다.

To Falling은 Locomotion과 Fall Loop를 키고
To Land는 Fall Loop와 Jump를 키면 된다.

다음 상태 규칙을 넣어보자.
떨어지는 상태에서 점프와 Fall Loop 두가지로 갈 수 있는데

각각의 전이 규칙에 Is Falling이 true일 경우를 넣어줄 것인데, 점프 방향의 경우 velocity 변수로 z 벡터를 받아 떨어지는 것과 높이 벡터의 속도를 같이 확인해준다.

다음 점프에서 Fall Loop로 가는 방향의 경우

점프는 위로 올라가면 어떤 규칙이 필요 없이 무조건 떨어지는 모션을 보여야 한다.
스테이트 시퀀스 플레이어에 따른 자동 규칙은 애니메이션이 끝났는지 아닌지를 기준으로 다음 상태로 전이시키는 규칙이고 이것을 켜주면 된다.

다음으로 Land에서의 규칙인데

To Land에서 Land로의 규칙은 Is Falling이 false일 때 그리고 Land에서 Locomotion으로 갈 때는 Should Move일 때로 규칙을 넣어주면 된다.

이렇게 플레이해보면 잘 움직이지만 점프하고 캐릭터가 사라지는 현상이 있는데 원인은 정확히 모르겠다.
내가 만든 것은 Land 상태를 바로 연결했었는데

템플릿을 보고 Apply Additive를 추가하니까 잘 되었다.
Apply Additive는 기본 포즈에 추가적인 움직임을 더하는 기능이다.

다음의 문제로 점프 상태에서 땅에 닿는 타이밍에 다시 점프를 누르면 떨어지는 포즈에서 정지하는 현상이다.

점프 애니메이션 시퀀스에서 애니메이션 루프를 켜주니까 해결되었다.


애니메이션 루프는 애니메이션이 끝까지 재생되면 처음 프레임으로 돌아가 반복하는 것이라 왜 이걸 켜야 해결되었는지도 잘 모르겠다.

마지막으로 발생한 문제는, 높은 물체에 올라갈 때 타이밍에 맞게 점프하면 모션이 지연되어서 보이는 현상이 발생했다.

이 문제를 해결하려고 찾는데 엄청 오래걸렸는데 스테이트를 누르고 맨아래 이벤트 토글을 누르면 진입 시 항상 리셋이라는게 있고 이걸 켜주어야 한다. 생각해보면 모션이 리셋되지 않고 중간부분부터 재생되어서 발생한 것이였다.

이렇게 하면 마무리가 된다. 하지만 잘 작동함에도 아직 연결하지 않은 부분이 있었는데

control rig 부분이다. 아래 그림을 보면 경사로에서 발이 떠 있는 것을 볼 수 있다.

언덕에서 발을 맞추는 기술을 Foot IK라고 한다. 이것은 지면의 경사도에 맞게 캐릭터의 발 위치와 회전을 조정하는 역할을 한다.
control rig를 열어보면 아래와 같은 블루프린트인데 보고 이해하지는 못할 것 같다.

이정도로 하고, control rig 관련 노드들을 연결하고 실행하면

전보다 개선된 모습을 보여준다.

profile
게임 AI 개발자 조정원입니다.

0개의 댓글