여러가지 애니메이션들을 캐릭터의 상태에 따라 애니메이션 블루프린트에서 동적으로 제어해 주어야한다.
우선, 애니메이션 블루프린트를 생성한다.
스켈레톤을 골라서 생성한다. Parent Class는 AnimInstance 그대로 사용한다.
스켈레톤 기준으로 애니메이션을 만들게 된다. 애니메이션 블루프린트의 파일명 접두어는 ABP이다.
Anim Instance는 애니메이션 시스템에서 가장 핵심적인 역할을 하는 클래스다.
Mesh같은 경우는 스켈레탈 메시가 같고 메시만 다른 스태틱 메시들을 보여준다. 선택하고 Apply To Asset을 누르면 적용된다.
에셋 브라우저에는 다양한 애니메이션 시퀀스 파일들과 애니메이션 관련 리소스들이 있다.
아웃풋 포즈는 애니메이션의 최종 출력본이다.
애니메이션 노드를 클릭하고 Details에서 Loop를 체크하면 반복 가능하다.
캐릭터 클래스는 이동과 관련된 정보가 담겨있고, 이를 이용하여 애니메이션 전환 시점을 정해줄 수 있다.
Blueprint Initilalize Animation은 이 애니메이션 블루프린트가 초기화 될 때 호출된다. 초기데이터를 설정해주면 좋다.Get Owning Actor는 이 스켈레탈 메시를 가진 액터를 가져오라는 의미이다.
Character Movement를 가져와야 하기 때문에 오너는 반드시 Character여야 한다. 따라서, Cast To Character로 캐릭터인지 확인한다.
캐릭터가 맞으면 변수로 승격하여 Set 해준다.이후 가져온 캐릭터의 Character Movement까지 가져와서 변수로 저장해주고 둘 다 카테고리는 References로 한다.
Event Blueprint Update Animation 노드를 추가한다. 이벤트 그래프의 Tick과 비슷한 노드다.
캐릭터 Validation을 위해 변수의 Get Character 노드를 배치하고 우클릭 후 Convert to Validated Get으로 설정한다.
Validated Get으로 변한 노드에 시퀀스를 연결한다. 그리고 Character Movement에 Get Velocity 노드를 연결하여 속도를 가져온다.
뛰거나 걷는 상황에서는 Z축이 필요없으니 배제한다.
Vector Length XY로 방향값없는 크기만 측정하여 스칼라 값으로 변환한다.
가져온 Vector에서 스칼라 값을 추출해 Ground Speed 변수로 승격해준다.
다음으로는 캐릭터가 움직였는지 아닌지를 판단한다.
Character Movement를 가져와서 Get Current Acceleration으로 가속도 값을 가져온다.
!= 노드를 붙여 0이 아님을 확인한다.Ground Speed > 3이고 가속도가 0이 아닌 상황을 움직이고 있다고 정의한다. And 연산 후 변수로 승격해준다.변수명을 bShouldMove로 해주고, Set을 Sequence 노드의 두 번째 핀에 연결한다.캐릭터의 움직임을 감지하는 이벤트 그래프
점프
캐릭터는 점프 시 공중에 있고, 점프 애니메이션이 끝나면 떨어진다. Character Movement에 Is Falling이라는 함수가 있으므로 해당 함수를 호출하여 처리할 수 있다.
bIsFalling이라는 변수로 승격하고 Sequence 노드의 세 번째 핀에 연결한다.
컴파일하고 저장한다.
State Machine
상태에 따라서 적절한 애니메이션으로 변경해주는 장치.
State Machine을 만들고 Locomotion으로 이름을 변경한다. 더블클릭으로 진입한다.
Add State로 Idle State를 추가한다.
Idle State에 들어가 Idle 애니메이션 시퀀스를 연결해주고, Loop Animaition도 설정해준다.Idle에 Entry를 연결하면 Idle 상태로 시작하게 된다.Walk/Run State를 하나 만든다.
블렌드 스페이스
블렌드 스페이스 타입의 애니메이션Speed를 인자로 받는 1D 블렌드 스페이스
Walk/Run에서 Ground Speed를 인자로 블렌드 스페이스를 연결해준다.
화살표 위 아이콘을 더블클릭하여 조건을 지정한다.
아까 만들었던 Should Move를 연결해준다.
멈추는 건 NOT 노드를 써서 반대로 해주면 된다.Main State라는 State를 하나 더 만들어준다.그 아래에 Is Falling + NOT 노드를 만들어준다.
Control Rig(컨트롤 리그)
지형의 높낮이에 따라 애니메이션을 다르게 적용해줄 수 있다.
Control Rig라는 노드를 생성한다.Set Initial Transform From Mesh를 체크한다.추가로 Control Rig Class에서 BasicFootIK라고 되어있는 것을 gkfekd한다.그 후 OR Use Curve도 체크해준다. 둘 중 하나만 체크해도 나머지도 체크된다.노드를 위와 같이 잇는다.
Control Rig는 캐릭터의 뼈 구조를 잡고 움직여주는 조작도 같은 것이다. 예를 들어 캐릭터의 손을 특정 위치로 옮겨주는 등이다. IK는 특정 뼈를 움직였을 때 나머지도 자연스럽게 같이 움직이도록 계산해 주는 것이다. Control Rig는 IK의 계산값을 따라서 실제로 캐릭터를 움직여준다.
Main States에 바깥에 있는 State를 적용하려면 캐시포즈로 저장해야한다.
State를 New Save cached pose에 연결하고, 이름을 똑같이 지어준다. 이렇게 하면 캐시된 애니메이션 데이터를 재사용할 수 있다.
Main States안에 들어가 State를 하나 새로 만들고 더블클릭한다. 안에서 Use cached pose를 추가한다.연결해준다. 이렇게 하면 노드 하나로 설정해준 모든 내용이 아웃풋에 들어가게 된다.
Land State를 생성하고, 안에 똑같이 Locomotiond을 생성한 뒤 Apply Additive로 이어주고, MM_Land 애니메이션을 연결해준다.
자연스러운 전환을 위해 Land 애니메이션을 추가한다.
Land 애니메이션에 Loop를 추가해준다.
한번만 착지하는데 Loop를 걸어주는 이유는 착지하고 나서 다른 동작을 이어줘야하거나, 상태 전환이 안 됐을때 정지된 것처럼 보이는 버그를 방지하기 위함이다.
Land를 Locomotion에 연결하고 조건에는 Should Move를 넣어준다.
Land->Locomotion을 다시 한 번 연결하면 전환 조건이 하나 더 생긴다.Should Move를 적용하지 않은 조건에 Automatic Rule Based on Sequence Player in State를 체크해준다. 그러면 애니메이션으 종료된 후 자동으로 전환되게 된다.Add State Alias를 추가하고 To Land로 이름을 지어준다.State Alias는 State들의 묶음이다.Fall Loop State를 하나 생성한다.Fall Loop 안은 Fall_Loop 애니메이션을 적용하고, Loop도 켜준다.
Jump도 하나 만들고, 애니메이션을 연결해준다. Jump의 루프는 켜지 않아도 된다.
To Falling이라는 State Alias를 만들어준다.
Jump와 Fall Loop를 이어주고 Automatic Rule Based on Sequence Player in State를 체크한다.
To Falling은 Locomotion과 Land를 체크해놓고 Jump로 이어준다.Jump가 되는 조건은 Velocity를 가져와서 벡터 핀을 나눠준 후, Z가 100보다 크면서 Is Falling이 True일 때로 제한한다.
To Falling-> Fall Loop를 연결하고, 조건은 Is Falling이 True일 때로 준다.
To Land-> Land 부분의 전환 조건은 IsFalling에 NOT 노드를 연결해서 구현한다.