Gorka Games 채널의 Unreal 5 RPG Tutorial을 따라하며 정리한 글2.
BlendSpace와 애니메이션 블루프린트 기초에 대한 내용.
출처 : https://www.youtube.com/watch?v=WcDj4uZygyE&list=PLiSlOaRBfgkcPAhYpGps16PT_9f28amXi&index=3
이전 포스트와 이어집니다 - https://velog.io/@woolzam/%EC%95%A0%EB%8B%88%EB%A9%94%EC%9D%B4%EC%85%98%EC%8B%A4%EC%8A%B51

저번에 이어서, 이번엔 캐릭터의 점프 및 낙하 애니메이션을 만들어보자.
애니메이션 블루프린트의 Main에 그림과 같이 스테이트와 State Alias를 만든다.
Jump : 스테이트. 점프 애니메이션(MM_Jump)과 연결.Falling: 스테이트. 낙하 애니메이션(MM_Fall_Loop)과 연결. 루프이므로 애니메이션 노드에서 애니메이션 루프에 체크.To Falling: State Alias. Unarmed Locomotion을 체크. State Alias : 기입한 스테이트는 해당 State Alias과 연결된 트랜지션에 따라 스테이트 전환이 가능하다.
ex) 여기에선Unarmed Locomotion(걷기/뛰기) 스테이트를To Falling에 기입해 두었는데 낙하조건, 즉To Falling->Falling트랜지션 룰을 만족했을 때 'Falling`으로 스테이트가 전환된다.
트랜지션은 다음과 같다.
Jump -> Falling : 자동(애니메이션이 끝나면).
To Falling -> Falling : 캐릭터가 떨어지고 있는 체크할 Is Falling이란 부울 변수를 만들어서 True면.
To Falling -> Jump :
캐릭터의 속도를 저장할 velocity 변수를 만든다.
1)z 좌표 속도가 100보다 크고, 2) Is Falling이 True일 때, 즉 떨어지고 있을 때 트랜지션에 진입한다.

이번엔 낙하를 만든다.
그림과 같이 스테이트 및 State alias를 만든다.
Land : 스테이트. 착지 애니메이션(MM_Land)와 연결.To Land State Alias.Jump와 Falling 스테이트를 체크한다. 즉 점프하거나 떨어지고 있을 때만 낙하가 가능. 트랜지션은 다음과 같다.
To Land -> Land : Is Falling이 False일 때.Land -> Unarmed Locomotion : 자동.
이벤트 그래프로 와서,
이벤트 그래프에서 Event Blueprint Update Animation 노드에서 speed 변수를 갱신하는 부분에 이어서 velocity와 is Falling을 갱신하는 부분을 구현한다.
velocity : 폰의 GetVelotiy함수에서 가져온다.is Falling : 캐릭터 무브먼트의 IsFalling함수에서 가져온다. (Character변수 : 플레이어의 폰을 저장해둔 변수) 컴파일 해보고 플레이해보면 착지와 점프 모션이 이상한 것을 볼 수 있다.

이것은 착지 애니메이션인 MM_Land가 Additive 타입이라 그렇다. Land 스테이트는 다음과 같이 Apply Additive 노드를 통해 Locomotion에 착지 애니메이션을 더한 포즈와 연결해준다.
Additive 설정에 체크된 애니메이션은 베이스가 되는 애니메이션에 더해서 더욱 자연스러운 애니메이션을 만드는 데 사용된다.

설정해둔 점프모션도 제대로 작동하지 않았는데,
이는 To Falling에서 Jump로 가는 트랜지션과 Falling으로 가는 트랜지션의 우선순위가 같기 때문에 그렇다. Falling -> Jump 트랜지션의 우선순위가 높아지게 설정하면 해결된다.
다음으로 웅크린 상태에서 대기/걷기 하는 애니메이션을 적용한다.걷기/뛰기 때와 많이 비슷하다.
BlendSpace 1d 에셋을 하나 만들고 Crouch_Idle과 Crouch_Walk를 블렌딩한다.
마찬가지로 블렌딩에 사용할 값은 Speed로 하되, 웅크린 상태이므로 최고값은 일받 걷는 것보다 느린 350으로 한다.

다만 저번에 사용한 걷기/뛰기 애니메이션은 제자리에서 걷고 뛰는 애니메이션이었지만 이번에 사용할 Crouch_Walk 애니메이션은 캐릭터의 위치가 바뀌는 모션이 포함되어 있기 때문에 주의해야한다.
Crouch_Walk의 루트 모션 프로퍼티를 그림과 같이 세팅한다.
루트 모션(Root Motion) :
루트 모션을 활성화시키면 캐릭터의 무브먼트가 애니메이션에 영향을 받게 된다. 반대로 활성화시키지 않았을 경우 보이는 캐릭터가 아무리 요리 조리 움직여도 실제 캐릭터는 가만히 있게 된다.

이번에도 Crouched 스테이트 머신을 만들고, 캐시를 만든다.

Main에서 Crouched Locomotion 스테이트를 만들고 만들어 둔 캐시와 연결한다. 그림처럼 Unarmed Locomotion과 서로 전환될 수 있게 한다. 캐릭터가 웅크렸는 지 여부를 알려주는 IsCrouched를 만들어서 트랜지션 규칙으로 사용한다.

캐릭터 블루프린트에도 crouched 변수를 만들고 애니메이션 블루프린트의 이벤트 그래프의 Event Blueprint Update Animation 노드에서 변수 갱신 부분을 구현한다.
웅크리기를 위한 새로운 input action만들고 input mapping context에 등록하여 캐릭터의 crouched를 토글하면 캐릭터가 웅크리고 일어서는 것을 볼 수 있다. input action에 대해선 다른 포스트도 적은 적이 있으니 생략한다.
영상에서 웅크렸을 때 캐릭터 최대 속도를 낮추거나 카메라 범위를 변화시키는 부분도 애니메이션과 직접적으로 관계 없으니 생략한다.
마지막으로 자연스러운 달리기 모션을 위해 달리는 중 옆으로 꺾었을 때 꺾은 쪽으로 기울이는 모션을 추가해 본다.

달리기 애니메이션인 MM_Run_Fwd를 복사해서 Lean_Left와 Lean_Right를 만든다. 애니메이션의 스켈레톤 트리에서 pelvis를 좌/우로 10도 씩 회전시키고 +키 버튼을 눌러 키를 추가한다.

locomotion 애니메이션에 더해지는 방식이기 때문에 additive 프로퍼티를 활성화한다. (세부 설정에 대해선 추후 더 공부해볼 예정.)
두 애니메이션을 BlendSpace 1D 에셋을 만들어 블렌딩한다. 블렌딩할 사용할 값은 Lean Value로 이름 지어 주고 범위는 -45부터 45로 한다. 방향을 회전할 때 각도값을 Lean Value에 대입해서 사용할 것이다.

애니메이션 블루프린트으로 돌아와 locomotion 스테이트 머신의 walk/run 스테이트를 그림과 같이 수정한다. Yaw Delta라는 변수를 만들어 캐릭터의 (Yaw)회전 각도값을 구하고 이를 Lean Value에 넣어 몸을 얼마나 기울일지 정할 것이다. (-1을 곱해준 것은 방향때문에. BlendSpace에서 Lean_Left를 왼쪽에 두었을 경우.)

이벤트 그래프의 Event Blueprint Update Animation 노드의 마지막에 다음을 추가해준다.
이 복잡한 프로세스는 다음과 같이 진행된다.
1)Last Frame Rotation 변수, 즉 저번 프레임 회전값과 현재 프레임 회전 값의 차이를 구한다.
2) 그 차이 중 Yaw값만을 가져와 Delta Time으로 나눈다. Delta Time은 노드가 지저분해지는 걸 막기 위해선지 따로 변수로 저장해주었다.
3) 이를 10으로 나눈다. 원본 영상 제작자가 생각한 '적당한' 값이다. 값을 낮추면 기울이는 정도가 더 급격하게 바뀐다.
4) 이렇게 나온 값과 Yaw Delta값을 Finterp To 노드를 사용해 보간한다.
5) 결과값을 사용해 Yaw Delta를 갱신하고 현재 프레임의 회전 값을 Last Frame Rotation에 저장한다.
이렇게 자연스럽게 걷고 뛰고 점프하고 웅크리고 기울이는 모션을 가진 캐릭터가 완성되었다!
(결과물은 원본 영상 참고)