활 무기를 들고, 에임 상태가 됐을 때 조준하는 애니메이션을 출력하도록 Aim Offset을 제작하고 적용해보았다.
💻 CAnimInstance 클래스 수정
먼저 Aim상태인지 아닌지에 따라 애니메이션이 달라지기 때문에, AnimInstance 클래스에 Aim 상태인지를 판별하기 위한 bAim_Bow 변수를 추가하였다.
Cpp 클래스의 Update 함수에서는 WeaponComponent가 존재할 때, SubAction_Aiming 클래스의 bAiming 변수를 계속해서 불러와 AnimInstance에서도 Aim 상태를 확인할 수 있도록 하였다.
🦾 Animation Blueprint 수정 : ABP_Character
기존에는 활을 들고 움직이는 Bow BlendSpace만 연결해 둔 상태였다.
먼저, C++에서 직렬화 해둔 bool AimBow 변수를 불러와서, 에임 모드가 아니라면 기존의 BS_Bow 블렌드스페이스를 그대로 출력하고, 에임모드라면 에임 오프셋을 블렌딩하여 출력하도록 하였다.
첫번째 본마다 레이어로 블렌딩하는 기준은 스켈레탈 메시의 spine_02(명치쪽) 이다.
기존의 BS_Bow 애니메이션을 하체로, 에임모드로 활을 당기는 애니메이션을 상체로 하여 1차적인 블렌딩을 수행하고,
플레이어의 각도(Pitch)값에 따라 상체가 위 또는 아래로 움직여야 하므로, 에임 오프셋을 포함한 2차 블렌딩을 수행하였다.
🏹 Camera Pitch 각도 제한
에임 상태에서 바라볼 수 있는 Camera의 Pitch 각도를 제한하기 위해 CAttachment_Bow 클래스에 ViewPitchRange 변수를 추가하였다.
원본 카메라 각도를 저장해두기 위한 OriginViewPitchRange 변수도 추가하였다.
활 무기가 Equip 될 때 호출되는 OnBeginEquip 함수에서 PlayerController 객체를 가져와 PlayerCameraManager의 ViewPitch Min/Max 값을 제한범위로 설정해주었다.
컴파일 후 프로그램을 실행시켜보면 Aim 상태에서 활 시위를 당기는 애니메이션이 잘 출력되고, Camera 회전범위가 위아래로 제한되어 과도한 회전을 방지하는 모습을 확인할 수 있었다.