
먼저 이전에 생성했던 스켈레탈 메시를 더블 클릭해보자

그럼 위의 사진처럼 스켈레톤을 새로 만들거냐고 물어보는데 여기서 "아니오"를 골라준다.

그 다음 가지고 있는 스켈레톤 에셋을 선택해준다.


그 다음 콘텐츠 폴더에 애니메이션 폴더를 다로 만들어서 가지고 있는 애니메이션 시퀀스들을 전부 애니메이션 폴더로 옮긴다.

애니메이션 시퀀스들도 전부 더블 클릭해서 스켈레톤을 지정해준다.

그 다음 콘텐츠 브라우저를 우클릭하여 애니메이션 블루프린트 클래스를 생성한다.

스켈레톤은 기존에 가지고 있는 스켈레톤 에셋을 선택한다.

애니메이션 블루프린트 클래스의 이름을 ABP_Main으로 짓는다.

이전에 만들어두었던 캐릭터 액터로 들어가면 디테일 바에 애니메이션 항목이 보이는데 여기서 애니메이션 모드에서 블루프린트 모드를 선택해야 한다. 하나의 캐릭터에 다양한 움직임을 적용시키기 위해선 블루프린트 모드를 적용해야 한다.

방금 만든 ABP_Main으로 들어가보자.
이벤트 그래프에 Output Pose라는 노드가 있는 이것은 최종적으로 나타낼 애니메이션을 뜻한다.

우측 에셋 브라우저에서 애니메이션을 하나 드래그 드랍하고 Output Pose와 연결해보자.

그리고 우측에 디테일 바에서 애니메이션 루프 항목을 활성화해주어야 애니메이션의 동작이 끝나도 다시 처음부터 시작하는 루프가 진행된다.

컴파일/저장해보면 그림처럼 애니메이션이 동작하는 모습을 볼 수 있다.
하지만 하나의 애니메이션만 동작할 것이 아니기 때문에 기존에 추가한 애니메이션을 삭제하자.
그리고 다양한 애니메이션을 상황에 따라 동작시킬 것이기 때문에 애니메이션 상태도를 추가해야 한다.

애니메이션 그래프에서 우클릭하여 State Machine를 검색하여 노드를 생성한다.

State Machine을 더블 클릭하고 우측에 에셋 브라우저에서 Idle모션을 드래그 드랍하여 Entry와 연결시켜준다.
Idle모션은 가만히 있을 때 적용되는 모션이다.

그 다음 Fall모션을 드래그 드랍해주고 Idle모션과 연결시켜준다. 이 때 화살표에 생기는 Transition을 더블 클릭하여 들어간다.

들어가게 되면 Can Enter Transition 노드가 있는데 여기에 True값이 들어가면 Transition이 발생하여 애니메이션 동작을 바꾼다.
이제 여기에 "떨어지는 중이라면"의 조건을 충족하는 bool타입 변수를 연결시켜주어야 한다.

이벤트 그래프에 가보면 Try Get Pawn Owner라는 노드가 존재한다.
이 노드는 이 애니메이션 블루프린트를 가지는 폰을 가져오는 기능을 한다.
이 액터의 클래스는 캐릭터이지만 이 캐릭터는 폰의 자손이므로 이 폰을 내가 만든 캐릭터 클래스로 바꿔줄 수 있다.

Try Get Pawn Owner노드의 우변에서 끌어와 Cast To 내가만든클래스이름 을 검색하고 노드를 생성한다.
변환이 가능한 경우에 내가 만든 캐릭터 클래스의 전달이 가능해진다.
실패할 경우 Cast Failed부분이 실행된다.

Event Blueprint Update Animation의 우변과 Cast To노드를 연결시켜준다.
Event Blueprint Update Animaion : 애니메이션이 실행되고 애니메이션이 갱신될 때마다 작동하는 노드

그 다음 변수에 bool타입 변수 Is Falling을 생성하고 이벤트 그래프로 드래그 드랍하여 Set타입으로 노드를 생성한다.

그 다음 Cast To노드의 As 내가만든캐릭터클래스이름 에서 끌어와 Is Falling을 검색하여 노드를 생성한다.
방금 만든 변수가 아닌 언리얼엔진에서 지원하는 기능으로 캐릭터가 떨어지는 중인지 여부를 판단한다.

그러면 자동으로 캐릭터 무브먼트를 가져와 캐릭터의 움직임을 읽는 기능이 추가된다. 노드들을 위의 사진과 같이 배치한다.

그 다음 Idle과 Fall 사이의 Transition으로 들어간다.

좌측 아래 내 블루프린트에서 Is Falling변수를 Get타입으로 가져와서 Can Enter transition노드와 연결한다.

그리고 State Machine노드를 Output Pose노드와 연결해준다.

이제 캐릭터 블루프린트 클래스에 방금 만든 애니메이션을 적용해줘야 한다. 캐릭터 블루프린트 클래스로 들어가 디테일 바에서 애니메이션 항목의 애님 클래스를 ABP_Main으로 설정해준다.

그리고 컴파일/저장을 해주고 실행시켜보면 떨어지는 동작이 구현된 것을 볼 수 있다.

이제 보다 정확한 상태도를 만들어주기 위해서 State Machine으로 돌아간다. 더 많은 모션을 적용시켜주기 위해서 일단 Fall모션을 삭제해준다.

그 다음 콘텐츠 브라우저에서 우클릭하여 애니메이션 항목에서 블렌드 스페이스를 눌러 생성한다.

이름은 BS_Idle로 짓는다.

블렌드 스페이스에 들어간 모습이다.

우측 에셋 브라우저에서 Idle모션을 중간 하단에 있는 그래프에 드래그 드랍한다.
그럼 위의 사진처럼 점이 생기는 모습을 볼 수 있다.

이제 좌측에 에셋 디테일에서 Axis Settings에서 가로축의 이름을 Speed로 바꾼다.
현재 캐릭터의 속력에 따라 Idle - Walk - Run 모션을 차례대로 나타나게 만들어야 하는데, 이때 필요한 건 캐릭터의 속도 뿐이기 때문에 가로축만 변경해주면 된다.

이제 에셋 디테일의 아래쪽으로 드래그 해보면 블렌드 샘플에 방금 추가한 Idle모션이 있는 것이 보인다. 움직이지 않을 때 Idle모션이 나와야 하므로 Speed는 0으로 지정하고 세로축 None은 아무 필요가 없기 때문에 0으로 정해준다.
세로축 None은 어떤 값이든 모션 변화에 영향이 없게 만들 것이다.


그 다음 Walk모션을 추가하고 가로축 세로축 값을 조절해주어야 한다.

그런데 200으로 쓰고 엔터를 누르니 값이 강제로 100으로 변화하였다. 이는 가로축의 최댓값이 100으로 설정되어 있기 때문이다.

Axis Settings에서 최대 축 값을 500으로 변경해준다.

이제 가로축의 값에 100을 초과하여 입력할 수 있다.

Run모션도 추가해준 다음에 Speed를 500으로 설정한다.

그 다음 애니메이션 그래프로 가서 BS_Idle(방금 만든 블렌드 스페이스)을 드래그 드랍해주고 Entry와 연결해준다.

이제 캐릭터가 움직이는 속력을 알아내야 한다. 이벤트 그래프에서 캐릭터 무브먼트 노드의 우변에서 끌어와 Get Velocity를 검색하여 노드를 생성한다.

Get Velocity의 우변에서 끌어와 To Vector2D를 검색해 노드를 생성하고 이 노드에서 다시 우변에서 끌어와 Vector2D Length를 검색하여 노드를 생성한다.
To Vector2D : 떨어지는 중에 달리는 모션이 발생하지 않도록 캐릭터의 움직임 중 z축 움직임을 속력에서 배제하기 위함이다.
Vector2D Length : 캐릭터가 벡터의 이동량을 크기로서 나타내준다.

그 다음 플로트 타입의 변수 Speed를 만들어준다.

Set타입으로 이벤트 그래프로 끌어오고 Vector2D Length에 연결하고 Is Falling의 Set노드와 연결시켜준다.
이제 캐릭터가 움직이면 그 움직임을 토대로 Speed변수에 속력을 받아올 수 있게 되었다.


BS_Idle를 더블 클릭해서 들어온 다음 BS_Idle의 Speed항목에 Speed변수를 Get으로 가져와 연결해준다.
BS_Idle 노드에 Speed와 None는 아까 전에 블렌드 스페이스에서 설정한 세로축 가로축이다.
이제 컴파일/저장 후 실행시켜보자.

걷는 모션이 거의 없이 뛰는 모션이 바로 실행되는 이유는 가속이 붙는 속도가 너무 빨라서 걷는 모션이 거의 보이지 않는 것이다.

애니메이션 그래프 밑에 State Machine을 클릭하여 들어간 다음 우클릭 하여 스테이트 에일리어스 추가를 클릭한다.

그럼 위의 사진처럼 Alias노드가 생성된다.

Alias노드를 선택하고 우측을 보면 디테일 창이 있는데 여기서 BS_Idle을 선택한다.
여기서 체크된 상태에서 Alias와 연결된 다른 상태로 이동시킬 수 있음을 의미한다.

Fall모션을 드래그 드랍하여 노드를 생성하고 Alias와 연결한다.
Alias의 스테이트 에일리어스에서 Idle모션을 체크하고 Fall모션에 연결했으므로 Idle모션에서 Fall모션으로 바꿀 수 있게되었다.

그 다음 FallLoop모션을 드래그 드랍하여 Fall모션과 연결해준다.
FallLoop : 떨어지는 동안의 움직임이 반복되는 모션

Fall모션과 FallLoop모션 사이의 Transition을 클릭하고 우측 디테일 바에서 스테이트 시퀀스 플레...를 체크 해준다. 이는 Fall모션이 끝났을 때 자연스럽게 FallLoop모션으로 바뀔 수 있도록 해주는 항목이다.
스테이트 시퀀스 플레... : 스테이트의 시퀀즈 플레이에 따른 자동규칙

그 다음 Alias와 Fall모션 사이의 Transition으로 들어가서 Is Falling변수의 Get타입을 Can Enter Transition과 연결시켜준다.

이제 착지하는 모션까지 추가해보자.
State Machine에서 Land모션을 드래그 드랍하고 BS_Idle에 연결해보자

그 다음 이 둘 사이의 Transition에서 스테이트의 시퀀스 플레...를 체크


새로운 Alias노드 Alias_1을 만들고 Land에 연결한다.

그리고 Fall모션과 연결되어 있던 Alias노드를 클릭해 스테이트 에일리어스에서 Land모션을 체크해준다.

Alias디테일바에서 블렌딩 세팅을 보면 경과 시간과 그래프가 있는데 모션과 모션 변하는 사이 동안 모션이 뚝뚝 끊기면 어색해보이기 때문에 이 둘을 섞어주면서 걸리는 경과 시간과 변화폭을 그래프로 나타낸 것이다.

Alias_1노드를 BS_Idle와 연결해준다. 점프하고 나서 착지할 때 자연스럽게 달리는 동작이 이어지도록 하기 위함이다.

Alias_1과 BS_Idle사이의 Transition으로 들어가서 위와 같이 노드들을 배치해준다. 속도가 100이상이고 더 이상 떨어지는 동작을 하지 않을 때(착지 할 때) 자연스럽게 걷거나 달리는 모션으로 전환하는 것을 의미한다.

Alias_1과 Land모션 사이의 Transition으로 들어가서 위와 같이 노드들을 배치한다.
더 이상 떨어지지 않는 상태일 때 Land모션을 수행하도록 한다.
이제 컴파일/저장 후 실행시켜보자
