재차 글을 쓴 이유는... 앞서 쓴 글에서 문제가 있던 부분과 더불어 부질없는 고민도 있었기 때문입니다.
우선 수정된 애니메이션부터 공유해보겠습니다.
메인 FSMMainStateMachine::Idle State
일단 Layered Blend per Bone이 현재 상황에서는 의미가 없는 기능이었습니다.
Montage가 통째로 회전하더라도 머리의 방향은 AimOffset이 맞춰줄거기 때문에 굳이 Layered를 할 필요가 없었습니다.
그리고 Cache 포즈도 현재 Default 포즈를 따로 필요하지 않는 것 같아 일단은 제거해 두었습니다.
이전에 발생한 이슈는 2가지였는데요.
1. 왼쪽으로 고개 회전 시 무한이 회전하는 문제
이건 AimOffset 값 자체가 방향 정보도 포함하고 있어 Tick에서는 무조건 Delta만큼 차감하면 됐었는데, 이걸 다시 Type에 따라 반대로 연산하다 보니 왼쪽은 계속 가산되어서 그 방향으로 회전하게 되었습니다.
2. 고개가 90도로 맞게 회전하지 않는 문제
이건 Montage와 관련이 있었는데요.
초반 작업에서 Montage를 1배속으로 플레이 했을 때 90도가 아니라 225도를 회전하는 문제가 있었습니다.
AddControllerYawInput() 안에서 계수가 적용된 것으로 판단하여 MontagePlayRate를 조절하여 2.5배속 재생 되도록 UI에서 조절해 놓았는데, 이 때문에 몸이 90도 회전 하는 동안 -90도가 회전해야 할 머리가 -36도만 회전하였습니다.
그래서 UI에서 직접 입력하던 MontagePlayRate를 TurinInPlaceNotify.h에서 상수로 값을 잡아두고, Montage_Play()에서 MontagePlayRate를 입력하고, 동시에 Tick에서 연산되는 AimOffset에서도 MontagePlayRate를 곱하여 동일한 값만큼 몸과 고개가 움직이도록 조정했습니다.
이로서 제자리 회전에 대한 기능은 모두 완료가 되었습니다.
다음에는 방향키에 맞게 걷는 기능과, 회전 중 걷기 시 그 방향으로 걸어가는 기능을 구현할 예정입니다.
결국 다시 블로그 등을 검색하여 옵션을 넣었으나, 같은 불상사를 방지하기 위해 하기 설명에 옵션 사진도 같이 첨부하였습니다.
마지막으로 현재 제가 작업해놓은 Animation 부분을 공유합니다.
전체 Animation
외부에 Cached Pose를 두개를 둔 이유는 원래 참고하고 만들던 것과 더불어 새로운 Cached Pose가 필요하기 때문입니다. 성능적인 부분은 찾아봐야겠지만, 만약 크게 문제가 안된다면 가능한 이런 식으로 외부에 Cached Pose를 만들어두고 나중에 이를 가져다 쓰는 형식으로 구현하는 방향으로 구상 중입니다.
MainStateMachine 내부의 Idle 상태
실제 Idle 상태에서의 BP부분입니다.
뒤에 Offset으로 각도 조정을 해줄거기 때문에 Bone은 root를 그냥 넣어주었습니다.
Idle 상태에서의 FSM
Idle FSM 내부입니다.
임시로 상태를 만들어 서있거나, 앉아있는 등의 경우에서 Idle일 때의 Animation을 반환합니다.
구조는 나중에 필요에 따라 바뀔 여지는 있을 것 같습니다.
우선 문서를 작성하면서 확인해보니 왼쪽으로 회전에서 발생하는 문제, 혹은 고개가 완벽하게 각도가 안 맞는 부분이 있어 이 부분을 나중에 조정을 하고, 이후 걷는 애니메이션을 구현해볼 생각입니다.