Idle 상태와 Aim 상태에서의 에임 오프셋을 구현해보았다.
💡 프로퍼티 매트릭스를 통한 대량 편집
에임 오프셋을 만들기에 앞서, 사용하려는 애니메이션이 하나의 애니메이션 안에 프레임별로 다른 방향을 바라보는 모션이 전부 담겨져있었다. 따라서 Center를 바라보는 방향과, Down, Up 방향에 해당하는 프레임을 하나씩 잘라 애니메이션을 나누어주었고, 이렇게 잘린 애니메이션은 프레임이 1이기 때문에 기준 포즈(Idle)에 방향 포즈(Center, Down, Up)를 섞는 편집 과정을 수행하였다.
편집하려는 (잘라둔)애니메이션들을 모두 선택한 후 애셋 액션->프로퍼티 매트릭스를 통한 대량 편집 기능을 눌러 애니메이션 자체의 속성값들을 편집할 수 있다.
여기서 모든 애니메이션을 선택한 뒤, Additive Settings의 값을 변경해주었다. Additive 는 첨가물이란 뜻으로 오리지널 애니메이션에 다른 포즈를 섞을 수 있는 기능이다.
언리얼 설정에 의해 애니메이션이 변경되어야 하므로 Additive Anim Type을 Mesh 공간으로 설정해주어야 한다.
이후 Base Pose Type으로는 매 프레임마다 Idle 포즈를 섞고 싶기 때문에 Selected animation frame으로 설정하였다.
Base Pose Animation으로 Idle 애니메이션을 설정하여 하나의 프레임으로만 구성되었던 방향 애니메이션들이 Idle 모션처럼 흔들거리게 되었다.
📘 에임 오프셋 (1D)
이후 Idle 에임 오프셋 클래스를 생성하였다.
에임 오프셋의 기준 애니메이션도 마찬가지로 Idle 애니메이션을 주었다. 플레이어가 바라보는 Pitch 방향에 따라 하늘을 보거나 땅을 보도록 조절하기 위해 -90도부터 90도까지의 Pitch 범위를 설정하였고, 수치에 맞게 Down, Center, Up 애니메이션을 배치하였다.
이후, Idle 에임 오프셋 말고도 Aim 모드에서 사용하는 Aim 에임 오프셋을 같은 방법으로 생성하였다.
이때 Idle 에임 오프셋과 달리 Aim 에임 오프셋은 기준 포즈를 Fixed 애니메이션으로 설정하였다.
Fixed 애니메이션은 정면을 조준하고 있는 단 하나의 프레임으로 만들어진 애니메이션으로, Aim 모드에서는 플레이어가 조준하며 고정되어야 하므로 Fixed 애니메이션을 기준으로 잡았다.
이렇게 만들어진 에임 오프셋들의 Pitch 값을 조절하기 위해 AnimInstance 클래스에 Pitch 변수를 생성하였다.
AnimInstance 클래스의 Update 함수에서는 Pitch 값을 FInterpTo 함수로 보간하며 전달하였다.
플레이어가 위 또는 아래를 휙휙 봤을 때 화면이 끊기지 않고 부드럽게 이동하기 위함이다.
이때 사용된 GetBaseAimRotation은 OwnerCharacter(Pawn)의 현재 회전값을 전달해준다.
📗 시야각 제한
추가로 Player 클래스에서 위, 아래의 시야각을 제한하기 위한 PitchRange 변수를 선언하였다.
FVector2D 자료형으로 선언하여 X축을 아래 방향, Y축을 위 방향의 시야각 제한 범위로 초기화하였다.
초기화 된 시야각 제한 수치를 PlayerCameraManager의 ViewPitch Min/Max 수치에 할당해주었다.
최종적으로 애니메이션 블루프린트에 C++ 클래스에서 만들고 초기화한 Pitch값을 가져와 에임 오프셋을 조절해주었다.
아래는 시야각을 제한하며 Idle 모드와 Aim 모드에서 각각 구현한 에임 오프셋의 실행 모습이다.
![]() |
![]() |
![]() |
![]() |