[이득우 언리얼 C++] 7. 애니메이션 시스템의 설계
- 📕 Book/이득우 언리얼 C++
- 2022. 1. 13.
💻 Code : https://github.com/tedison7/ArenaBattle
애니메이션 블루프린트
언리얼 엔진에서는 애니메이션 시스템 제작 도구인 애니메이션 블루프린트를 제공한다.
- 애님 인스턴스(Anim Instance) : 스켈레탈 메시를 소유하는 폰의 정보를 받아 애님 그래프가 참조할 데이터를 제공 (BP, C++)
- 애님 그래프 (Anim Graph) : 애님 인스턴스의 변수 값에 따라 변화하는 애니메이션 시스템을 설계하는 공간 (BP)
C++로 애님 인스턴스를 제작하여 속력 값을 저장하고 애님 그래프에서는 이 값을 가지고 IDLE, RUN 애니메이션을 재생하도록 해보자
이후 이전에 생성해놓은 WarriorAnimBlueprint 애셋에서 부모 클래스를 ABAnimInstance로 변경하고 CurrentParnSpeed 변수를 가져와 0초과 일때는 Run 애니메이션을 0이하 일때는 Idle 애니메이션을 재생하도록 bool로 포즈 블렌딩 노드를 활용해 최종 포즈가 선택될 수 있도록 하였다.
애님 프리뷰 에디터 창에서 CurrentPawnSpeed 항목을 변경해보면 값에 따라 Idle과 Run 애니메이션이 재생됨을 확인할 수 있다.
폰과 데이터 연동
CurrentPawnSpeed 항목을 업데이트 해주기위해 Tick에서 폰의 속도 정보를 가져온 후 CurrentPawnSpeed 값을 업데이트 하도록 해보자
반대로 폰에서 스켈레탈 메시 컴포넌트의 GetAnimInstance 함수를 사용해 애님 인스턴스에 접근하여 CurrentPawnSpeed를 업데이트 할 수도 있다. 그러나 애니메이션 로직과 폰의 로직을 분리할수 있는 현재 방식을 대체로 사용한다.
스테이트 머신의 제작
애니메이션 블루프린트의 애님 그래프는 스테이트 머신(State Machine)기능을 제공한다. 스테이트 머신을 추가 해보자. 스테이트 머신 새로 추가를 눌러 BaseAction 이름으로 생성하였다.
생성한 BaseAction 스테이트 머신을 더블클릭하여 Ground라는 새로운 스테이트를 생성하였다.
그리고 생성한 Ground 스테이트를 더블클릭하여 기존에 작업한 그래프를 복사하여 적용되도록 하였다. 플레이 테스트를 해보면 인게임에서의 동작은 기존과 동일하다.
점프 기능의 구현
삼인칭 템플릿에서 이미 설정이 되어있는 Jump 입력을 연동하여 점프기능을 구현해 보자.
점프할때 달리는 모션이 재생됨을 확인할 수 있다.
폰의 무브먼트 컴포넌트는 현재 캐릭터의 상태를 알수 있는 함수를 제공한다.
- IsFalling() : 현재 공중에 떠있는 여부
- IsSwimming() : 현재 수영 중인지 여부
- IsCrouching() : 현재 앉아 있는지 여부
- IsMoveOnGround() : 현재 땅 위에서 이동 중인지 여부
IsFalling 함수를 사용해서 공중에 있는지 확인후 애니메이션을 설정해보자
추가한 IsInAir 변수를 가지고 블루프린트에서 사용할 것이다. 스테이트 머신 편집화면에서 Jump 스테이트를 추가하고 Ground 스테이트 간에 양방향으로 트랜지션을 추가해보자. 트랜지션 조건은 IsInAir 변수로 설정한다.
아직은 점프모션이 없기에 점프를 해보면 기본 자세가 나오는 것을 확인할 수 있다.
애니메이션 리타겟
언리얼 엔진은 인간형 캐릭터의 경우 스켈레톤 구성이 달라도 애니메이션을 교환할 수 있도록 애니메이션 리타겟(Animation Retarget)기능을 제공한다. 마네킹의 점프 애니메이션을 현재 캐릭터에 적용해보자.
- 마네킹의 스켈레탈 애셋에서 리타겟 매니저 -> 릭 선택 -> 인간형 릭 선택 -> 애셋 저장
- 워리어의 스켈레탈 애셋에서 리타겟 매니저 -> 릭 선택 -> 인간형 릭 선택 -> 애셋 저장
- 마네킹 애니메이션 Jump_End, Loop, Start 3애셋을 애님 애셋 리타겟->애님 애셋 복제후 리타겟
- 새애셋 이름과 폴더를 지정한뒤 리타겟 버튼 클릭
- 리타겟 된 애니메이션 파일 생성 확인
점프의 구현
애니메이션 블루프린트의 스테이트 머신으로 이동해서 Jump 스테이트를 JumpStart, JumpLoop, JumpEnd 3개의 스테이트로 확장한다.
- Ground -> JumpStart 는 IsInAir 변수가 true 일 때
- JumpStart -> JumpLoop 는 Time Remaining 이 10% 미만일 때
- JumpLoop -> JumpEnd 는 IsInAir 변수가 false 일 때
- JumpEnd -> Ground 는 Time Remainging이 10% 미만일 때
위와같이 트랜지션을 연결하였다. JumpStart -> JumpLoop / JumpEnd -> Ground 트랜지션은 Automatic Rule Based On Sequence Player in State 옵션을 체크하면 애니메이션 종료시 스테이트가 자동으로 전환된다 해당 옵션으로도 구현이 가능하다. 그리고 각 스테이트에 맞는 애니메이션을 연결해주어 점프모션이 재생되는지 확인해보자.
요약
- 애니메이션 블루프린트를 통한 애니메이션 시스템 파악
- 달리기, 점프 애니메이션 구현 실습 과정을 통한 학습