본문 바로가기
UE5 : 3D (Blueprint)/애니메이션

[UE5 : 3D(BP) - 애니메이션] Chapter 01. 애니메이션 블루프린트

by song.ift 2024. 2. 21.

GitHub : https://github.com/developeSHG/UE5-3D_BP/commit/8af7d136158ffcda6e5f88dc447ed01076dd84e2

 

애니메이션 블루프린트 · developeSHG/UE5-3D_BP@8af7d13

hokyung.song committed Feb 21, 2024

github.com

 

 

 


 

 

3D 애니메이션은 2D 애니메이션처럼 플립북 기능을 이용할 수 없다.  2D 이미지는 상대적으로 용량이 크지 않기 때문에 가능했었는데 3D 애니메이션은 파일의 크기가 크고, 3D 메쉬라는 것은 와이어프레임으로 보면 굉장히 많은 삼각형들로 이루어져 있기 때문이다.

 

그래서 Skeletal Mesh 라고 해서 뼈대 정보를 먼저 만들어주고, 뼈대에 해당하는 Mesh 정보를 만들어 준 다음에, 뼈들이 어떻게 움직이는지에 대한 정보를 파일에 기입하게 된다. (프로그래머가 기입하는 건 아니고, 애니메이터들이 툴로 만들어서 파일을 추출하면 만들어진다.)

캐릭터마다 애니메이션을 공유할 수 있는 애니메이션이 있고, 아닌 경우도 있다. 예를 들어 인간과 오크는 가능한데 인간과 슬라임은 불가능한 것처럼 뼈대가 비슷해야 한다.

 

 

Mesh 컴포넌트에 당연히 애니메이션을 설정할 수 있는 부분이 있다.

설정하고 View Port를 보면 프리뷰를 해서 어떤 모양으로 보일지 간단하게 나타낸다.

 

 

이전 2D 게임을 만들 때를 기억해보면 플립북이라는 개념이 사실 애니메이션의 개념이었다. 그런데 플립북을 현재 어떤 상황인지에 따라서 바꿔치기 하는 식으로 작업을 했었다.

그래서 상태라는 개념을 두고, 현재 이동하는 상하, 좌우 방향에 따라 가지고 알맞는 애니메이션을 코드 상에서 작업을 했었다.

 

하지만, 그렇게 하기엔 애니메이션 양이 너무 많다. 코드로 관리하기엔 벅차다.

 

 

언리얼 엔진에서는 편리한 방법으로 애니메이션을 관리할 수 있는 별도의 클래스를 하나 제공한다.

캐릭터 이동과 관련된 것은 Movement에다 옮겨줬고, 캐릭터를 조종하는 것들은 Player Controller에 넘겨줬고, 이런 식으로 정리정돈되어 자리를 찾아가게 되는데, 애니메이션 또한 Animation Blueprint라고 블루프린트지만 애니메이션을 관리하는 전용 블루프린트라고 존재한다.

블루프린트 클래스랑 사용하는 것은 비슷하지만 조금 인터페이스가 다르다.

 

애니메이션은 결국 스켈레탈 메쉬를 움직이는 것이기 때문에, 애니메이션 블루프린트 클래스를 만들면 스켈레톤을 선택하는 옵션이 나온다.

 

Output Pose는 Final Animation Pose, 애니메이션의 최종 결과를 의미한다. 최종적으로 여러 조건 혹은 상태에 따라 연산을 해서 그에 맞는 애니메이션을 골라 준 다음, 최종 결과를 반환한다.

 

이렇게 애니메이션 블루프린트를 만들고 설정했으면, 사용하게끔 연동해줘야 하는데 연동은 당연히 스켈레탈 메쉬를 움직이는 Mesh Component 에서 한다. 

 

 

State Machine(상태 기계)를 통해 걷기, 달리기, 멈추기 등 다양한 상태의 애니메이션을 적용하도록 관리한다. (State Pattern)

엔진에서는 코드 상에서만 하는 게 아니라 그래프로 관리할 수 있게끔 만들어 줬다.

 

State Machine을 더블 클릭하면, 어떤 특정 상태에서 다음 상태로 넘어갈 수 있는지에 대한 규칙을 만들어 줄 수 있게 된다.

Idle 상태를 더블 클릭하면 해당 상태에서 또 무엇을 할 것이냐는 것을 골라줄 수 있다.

Idle 상태에서 Idle_Relaxed란 애니메이션을 실행하도록 적용했다.

 

이런 식으로 최종 애니메이션을 골라주기 위해 상태 기계라는 것을 만들어줬고, 상태 기계안에서는 내가 어떤 상태인지에 따라 그래프를 만들어줬다.

또 현재는 Idle 상태에서 무조건 하나의 애니메이션만 적용했지만, 다양한 그래프를 만들어서 애니메션을 적용할 수 있다.

 

특정 조건에 의해 Idle에서 Move로 갈 수 있고, 거꾸로 Move에서 Idle로도 갈 수 있는 상태를 의미한다.

 

Dead 상태면 특이하게 부활하지 않는 이상, Idle 외 다른 상태로 돌아갈 일이 없으니 현재 상태에서 어디로 갈 수 있는지 코드를 만들어주면 명화하게 어떤 조건만 체크되는지 훨씬 깔끔하게 관리할 수 있다.

 

그래서 애니메이션뿐만 아니라 실제로 코드 로직을 작성할 때도 이렇게 상태 기반으로 함수들을 만들어 놓으면 굉장히 편리하게 관리할 수 있다.

 

 

어찌됐건 Idle에서 Move로 넘어갈 수 있는 상태인데, 어떤 상황에서 넘어갈 수 있는지 판단해야한다.

이벤트 블루프린트 업데이트 애니메이션 이라는 것이 있는데 이제 매 프레임마다 호출되고, 필요한 정보를 다 꺼내서 한 번 추출해 준 다음에, 그 정보를 이용해서 상태 변경을 체크해준다.그렇게 하면 장점은 작업했던 플레이어와 컨트롤러 등 온갖 게임 코드와 관련된 게 이어져서 들어가는 것이 아니라 필요한 정보들만 업데이트하는 코드에서 추출해서 그것을 매 프레임마다 한 번씩 작업한다.

 

나중에 AI도 약간 그런 느낌으로 되어있다.

필요한 것은 싹 다 꺼내줘서 임시로 저장해둔 다음, 그 저장된 값을 이어서 애니메이션을 틀어줄 때 사용한다.

 

Velocity로 속도가 0보다 크면 달리는 것으로 판단해서 Moving 불리언 타입 값을 설정함.

 

Idle -> Move 로 갈 때, 조건 체크

Move-> Idle 로 갈 때, 조건 체크

 

유심히 보면 애니메이션이 부드럽게 넘어간다. 애니메이션이 자연스럽게 블렌딩이라고 해서 섞이는 부분이 들어가기 때문이다. 

 

트렌지션에서 Blend Settings의 Duration을 조절해서 애니메이션을 몇 초 동안 섞을지 등등 수정할 수 있다.

값을 0으로 한다면 섞는 게 아니라, 그냥 바로 무조건 간다는 의미.

 

애니메이션 블루프린트의 장점을 얼마든지 툴에서 적절한 수치를 입력해 섞는 시간이나 비율을 설정할 수가 있다.

설정하는 공식도 굉장히 다양하다.

 

애니메이션 블루프린트는 Anim Instance 라는 것을 상속받아서 만들어졌다. 나중에 C++ 기반으로 작업하면 이 인스턴스라는 클래스를 상속받아서 그 안에서 작업한다.

 

 

상태 변경을 할 때, 반복되는 코드가 생길수도 있다. 이때 똑같은 조건을 재사용하는 편리한 기능도 있다. 

Shared transition name이라고 조건 자체를 기억할 수 있다.

댓글