OSWorlds - 게임 블로그 📌 게임 프로그래밍 📌 게임소식 🔑 로그인 📝 회원가입

언리얼 엔진 Aim Offset 사용법, 캐릭터가 위아래를 바라보게 만들기

캐릭터 이동 애니메이션을 어느 정도 구현하고 나면 다음으로 눈에 들어오는 부분이 있습니다.

캐릭터가 앞을 보고 있을 때는 괜찮은데 카메라를 위로 올리거나 아래로 내려도 캐릭터의 상체는 계속 정면만 바라보는 경우입니다.

특히 TPS 게임이나 총을 사용하는 액션 게임에서는 이런 현상이 상당히 어색하게 느껴집니다.

카메라를 위로 움직이면 캐릭터도 자연스럽게 위쪽을 조준하고, 아래를 바라보면 상체 역시 아래 방향으로 움직여야 합니다.

이때 Unreal Engine에서 사용할 수 있는 기능이 Aim Offset입니다.

저도 캐릭터 이동 애니메이션을 만든 뒤 카메라를 위아래로 움직여보면서 상체가 계속 정면만 바라보는 문제가 눈에 띄었습니다.

이동 자체는 정상인데 조준 방향이 캐릭터에 반영되지 않으니 TPS 액션에서는 상당히 어색하게 느껴졌습니다.

이 문제를 해결하면서 사용한 기능이 Aim Offset입니다. 이번 글에서는 기본 설정뿐 아니라 실제 프로젝트에서 Pitch와 Yaw를 연결할 때 확인했던 부분, 캐릭터 상체가 비정상적으로 꼬일 때 점검할 내용까지 함께 정리해보겠습니다.

💡 한 줄 정답 — Aim Offset은 캐릭터의 기본 애니메이션 위에 Pitch와 Yaw 값을 이용해 방향별 Pose를 섞어주는 애니메이션 시스템입니다. 정면·위·아래·좌·우 Pose를 준비하면 카메라나 컨트롤러 방향에 맞춰 캐릭터의 상체 방향을 자연스럽게 바꿀 수 있습니다.

목차


Aim Offset이란?

Aim Offset은 여러 개의 조준 Pose를 하나의 에셋에 배치하고 입력값에 따라 그 사이를 Blend하는 기능입니다.

쉽게 생각하면 이전 글에서 다뤘던 Blend Space와 상당히 비슷합니다.

예를 들어 캐릭터가 정면을 바라보는 Pose가 있습니다.

Aim_Center

여기에 위를 바라보는 Pose와 아래를 바라보는 Pose를 준비합니다.

Aim_Up

Aim_Center

Aim_Down

게임 중 Pitch 값이 올라가면 Aim_Up 방향으로 애니메이션이 섞이고, Pitch 값이 내려가면 Aim_Down 방향으로 섞입니다.

2D Aim Offset이라면 좌우 방향까지 추가할 수 있습니다.

Aim_UpLeft     Aim_Up     Aim_UpRight

Aim_Left       Aim_Center Aim_Right

Aim_DownLeft   Aim_Down   Aim_DownRight

이렇게 만들어두면 캐릭터가 바라보는 방향에 따라 자연스럽게 상체 자세를 변경할 수 있습니다.


Aim Offset과 Blend Space의 차이

Aim Offset Editor를 처음 열어보면 Blend Space와 상당히 비슷하게 생겼습니다.

그래서 처음에는 두 기능이 무엇이 다른지 헷갈릴 수 있습니다.

구분Blend SpaceAim Offset
대표 용도이동 애니메이션조준 방향
대표 입력Speed, DirectionPitch, Yaw
예시Idle → Walk → RunDown → Center → Up
사용 데이터Animation SequenceAdditive Pose
주요 적용 위치전체 캐릭터 이동주로 상체 방향

Blend Space에서는 예를 들어 Speed = 0이면 Idle, Speed = 600이면 Run이 재생됩니다.

Aim Offset에서는:

Pitch = 0
→ 정면

Pitch = 60
→ 위쪽

Pitch = -60
→ 아래쪽

처럼 사용할 수 있습니다.

따라서 두 기능은 경쟁 관계가 아닙니다.

실제 Animation Blueprint에서는 Blend Space로 이동 애니메이션을 만든 뒤 Aim Offset을 추가로 적용하는 구조를 사용할 수 있습니다.


Aim Offset에 필요한 애니메이션 준비하기

Aim Offset을 만들기 전에 방향별 Pose가 필요합니다.

가장 기본적인 형태라면 세 개부터 시작할 수 있습니다.

Aim_Up
Aim_Center
Aim_Down

좌우까지 표현한다면 다음처럼 늘어납니다.

Aim_UpLeft
Aim_Up
Aim_UpRight

Aim_Left
Aim_Center
Aim_Right

Aim_DownLeft
Aim_Down
Aim_DownRight

여기서 중요한 부분은 일반적인 걷기나 공격 Animation처럼 사용하는 것이 아니라 기본 Pose에 더해질 Additive Animation으로 사용하는 것입니다.

예를 들어 캐릭터가 달리고 있다면 Aim Offset 때문에 달리기 Animation 자체가 사라지는 것이 아니라,

Run Animation
+
Aim Pose

가 합쳐지는 구조입니다.

이것이 Aim Offset을 이해할 때 가장 중요한 부분입니다.

[여러 방향의 Aim Pose Animation Sequence]


Aim Offset 에셋 만들기

Content Browser의 빈 공간에서 마우스 오른쪽 버튼을 클릭합니다.

버전에 따라 Animation 관련 메뉴에서 Aim Offset 또는 Aim Offset 1D를 찾을 수 있습니다.

처음 연습한다면 위아래 방향만 사용하는 Aim Offset 1D부터 만들어보는 것도 좋습니다.

예를 들어 이름을:

AO_Aim

으로 지정하겠습니다.

좌우와 상하를 모두 사용하려면 2D Aim Offset을 사용합니다.

생성할 때는 캐릭터가 사용하는 Skeleton과 호환되는 애니메이션을 사용해야 합니다.


[Aim Offset 설정하기-출처 EpicGames 개발자 포럼]

Pitch와 Yaw 축 설정하기

2D Aim Offset을 사용한다면 일반적으로 두 개의 입력값을 사용합니다.

Horizontal Axis
→ Yaw

Vertical Axis
→ Pitch

예를 들어 테스트용으로 다음 범위를 설정할 수 있습니다.

AxisMinMax
Yaw-9090
Pitch-9090

그러면 중앙은:

Yaw = 0
Pitch = 0

이 됩니다.

오른쪽을 바라보면 Yaw가 양수 방향으로 이동하고 왼쪽을 바라보면 음수 방향으로 이동합니다.

위아래는 Pitch로 제어합니다.

다만 프로젝트의 회전 처리 방식이나 사용하는 애니메이션에 따라 실제 범위는 조절해야 합니다.


Aim Offset에 Pose 배치하기

이제 준비한 Pose를 Aim Offset Grid에 넣습니다.

중앙에는 정면 Pose를 배치합니다.

Yaw   = 0
Pitch = 0

Aim_Center

위쪽에는:

Pitch = 90
Aim_Up

아래쪽에는:

Pitch = -90
Aim_Down

좌우 Pose도 준비했다면:

Yaw = -90
→ Aim_Left

Yaw = 90
→ Aim_Right

처럼 배치합니다.

최종적으로 Grid를 보면 여러 Pose가 방향에 맞춰 배치되어 있어야 합니다.

마우스로 Grid 내부를 움직여 Preview Pose가 자연스럽게 바뀌는지도 확인합니다.


Animation Blueprint에서 Pitch 값 구하기

Aim Offset을 만들었더라도 캐릭터가 현재 어디를 바라보고 있는지 알려주지 않으면 움직이지 않습니다.

따라서 Animation Blueprint에서 값을 계산해야 합니다.

가장 먼저 필요한 변수를 만들어봅니다.

AimPitch

그리고 Event Graph에서 캐릭터 또는 Pawn의 Rotation 정보를 가져옵니다.

개념적인 흐름은 다음과 같습니다.

Event Blueprint Update Animation
            ↓
       Get Pawn Owner
            ↓
   Get Base Aim Rotation
            ↓
        Break Rotator
            ↓
          Pitch
            ↓
       Set AimPitch

Get Base Aim Rotation은 캐릭터의 조준 방향을 얻을 때 유용합니다.

[Animation Blueprint Event Graph의 Get Base Aim Rotation → Break Rotator → Set AimPitch 노드 연결 화면]


Yaw 값 구하기

2D Aim Offset을 사용한다면 Yaw도 필요합니다.

다만 단순히 Base Aim Rotation의 Yaw 값만 그대로 사용하면 캐릭터 자체의 회전까지 포함되어 원하는 결과가 나오지 않을 수 있습니다.

그래서 보통 캐릭터 방향과 Aim 방향의 차이를 구합니다.

개념적으로는:

Aim Rotation
      -
Actor Rotation
      ↓
Relative Rotation
      ↓
Yaw

입니다.

Blueprint에서는 Normalized Delta Rotator 같은 노드를 활용할 수 있습니다.

예를 들면:

Get Base Aim Rotation
          ↓
Normalized Delta Rotator
          ↑
Get Actor Rotation
          ↓
Break Rotator
          ↓
Yaw
          ↓
Set AimYaw

이렇게 하면 캐릭터 몸이 바라보는 방향을 기준으로 조준 방향이 좌우로 얼마나 차이 나는지 계산할 수 있습니다.

처음에는 카메라의 Yaw 값을 그대로 Aim Offset에 넣으면 될 것처럼 보이지만, 캐릭터 자체도 회전하는 구조에서는 예상보다 상체가 크게 틀어질 수 있습니다.

그래서 절대적인 Yaw 값보다 Aim Rotation - Actor Rotation처럼 캐릭터 기준의 상대적인 방향 차이를 사용하는 편이 관리하기 좋았습니다.


AnimGraph에 Aim Offset 연결하기

이제 가장 중요한 AnimGraph입니다.

기존에는 Blend Space 또는 State Machine 결과가 그대로 Output Pose로 연결되어 있을 수 있습니다.

Locomotion
     ↓
Output Animation Pose

여기에 Aim Offset을 추가합니다.

개념적으로:

Locomotion
     ↓
 Aim Offset
     ↓
Output Animation Pose

구조가 됩니다.

Aim Offset 노드에는 앞에서 만든 변수를 연결합니다.

Yaw
← AimYaw

Pitch
← AimPitch

그러면 Locomotion으로 만들어진 기본 캐릭터 Pose 위에 조준 Pose가 적용됩니다.

실제 프로젝트에서는 Aim Offset을 독립적인 이동 애니메이션처럼 사용하는 것이 아니라 기존 Locomotion Pose 위에 조준 방향을 추가하는 형태로 사용하고 있습니다.

그래서 Aim Offset이 정상적으로 움직이지 않을 때는 Locomotion 자체가 정상인지, Aim Offset 입력값이 정상인지 두 부분을 나눠서 확인하는 것이 문제를 찾기 편했습니다.


캐릭터가 위아래로 조준하는지 테스트하기

이제 게임을 실행해봅니다.

우선 캐릭터를 멈춰놓고 카메라를 위로 움직여봅니다.

정상이라면:

카메라 ↑
   ↓
AimPitch 증가
   ↓
Aim_Up 방향 Blend
   ↓
상체가 위쪽을 바라봄

이 됩니다.

이번에는 아래를 바라봅니다.

카메라 ↓
   ↓
AimPitch 감소
   ↓
Aim_Down 방향 Blend

여기까지 정상이라면 이동하면서 테스트합니다.

캐릭터가 Run Animation을 재생하면서도 상체 방향이 카메라를 따라 움직인다면 기본 Aim Offset 구조가 완성된 것입니다.


Aim Offset이 이상하게 움직일 때 확인할 것

Aim Offset을 적용했는데 원하는 방향으로 움직이지 않는다면 바로 Pose를 다시 만들기보다 먼저 AimPitch, AimYaw 값이 실제로 어떻게 변하는지 확인하는 것이 좋습니다.

PIE 상태에서 Animation Blueprint의 Debug Filter로 실제 캐릭터를 선택한 뒤 카메라를 위아래로 움직여 AimPitch 값이 변하는지 확인합니다.

카메라는 움직이는데 AimPitch 값이 계속 0이라면 Aim Offset Asset보다 Event Graph의 값 전달 과정부터 확인해야 합니다.

제가 사용하는 기본 흐름은 다음과 같습니다.

Get Base Aim Rotation → Break Rotator → Pitch → Set AimPitch

만약 카메라를 위로 올렸는데 캐릭터가 아래를 바라본다면 Pose를 다시 만들기 전에 현재 Pitch 값의 부호가 어떻게 들어오는지부터 확인하는 것이 좋습니다.

Yaw도 마찬가지입니다. 캐릭터가 회전할 때 상체가 심하게 꼬인다면 Base Aim Rotation의 Yaw 값을 그대로 사용하고 있지 않은지 확인합니다.

캐릭터가 바라보는 방향과 조준 방향의 차이를 구하기 위해 Normalized Delta Rotator를 사용하면 상대적인 Yaw 값을 얻을 수 있습니다.

Get Base Aim Rotation → Normalized Delta Rotator ← Get Actor Rotation → Break Rotator → Yaw

이 방식으로 값을 확인하면 Aim Offset Asset 문제인지 Animation Blueprint 변수 문제인지 원인을 구분하기 쉬웠습니다.


마무리

Aim Offset은 처음 보면 Blend Space와 비슷해서 단순한 기능처럼 보이지만 캐릭터의 움직임을 훨씬 자연스럽게 만드는 중요한 Animation 시스템입니다.

핵심 구조만 다시 정리하면:

카메라 / 조준 방향
        ↓
AimPitch + AimYaw
        ↓
     Aim Offset
        ↑
   Locomotion Pose
        ↓
Output Animation Pose

입니다.

Blend Space가 캐릭터가 얼마나 빠르게, 어느 방향으로 움직이는가를 표현한다면 Aim Offset은 캐릭터가 어느 방향을 바라보고 있는가를 표현한다고 이해하면 쉽습니다.

특히 TPS 액션 게임, 총기 게임, 활을 사용하는 캐릭터처럼 이동 방향과 조준 방향이 서로 달라질 수 있는 게임이라면 활용도가 상당히 높습니다.

직접 적용해보니 Aim Offset 자체를 만드는 것보다 AimPitch, AimYaw 값이 실제 캐릭터 기준으로 정상적으로 들어오는지 확인하는 과정이 더 중요했습니다.

특히 카메라 방향과 캐릭터 회전을 함께 사용하는 TPS 구조에서는 Yaw 값을 그대로 사용하기보다 상대 회전값을 계산하는 방식이 훨씬 자연스러웠습니다.

이후 공격 Montage나 조준 상태를 함께 연결하면 단순히 위아래를 바라보는 수준을 넘어 실제 전투 애니메이션 시스템으로 확장할 수 있습니다.


참고 사이트

이번 글에서 설명한 Aim Offset과 Animation Blueprint 관련 기능은 Unreal Engine 5.8 공식 문서를 기준으로 확인했습니다.

1. Epic Games – Creating an Aim Offset

Aim Offset을 처음 만드는 과정부터 방향별 Pose 준비, Pitch/Yaw 값을 이용한 조준 방향 처리까지 실제 예제를 통해 확인할 수 있습니다. 이번 글을 따라 실습할 때 가장 먼저 참고하기 좋은 공식 문서입니다.

2. Epic Games – Blend Spaces

Blend Space뿐 아니라 Aim Offset, Aim Offset 1D의 기본 개념도 함께 설명되어 있습니다. Epic은 Aim Offset을 Mesh Space Additive Animation을 Sample로 사용하는 Blend Space의 한 종류로 설명하고 있습니다.

3. Epic Games – Animation Blueprints

Aim Offset을 실제 캐릭터에 적용할 때 사용하는 Animation Blueprint의 기본 구조를 확인할 수 있습니다. AnimGraph에서 Animation을 Blend하고 최종 Pose를 만드는 전체적인 원리를 이해할 때 함께 보면 좋습니다.

함께 보면 좋은 글

  1. 언리얼 엔진 Blend Space 사용법 → 이동 애니메이션과 Aim Offset의 차이를 함께 확인할 수 있습니다.
  2. 언리얼 엔진 State Machine 사용법 → Locomotion 구조를 먼저 구성할 때 참고하기 좋습니다.
  3. 언리얼 엔진 Animation Montage 사용법 → 조준 상태에서 공격 애니메이션을 연결할 때 활용할 수 있습니다.
  4. 언리얼 엔진 Anim Notify 사용법 → 조준 상태에서 공격 판정을 처리할 때 참고하면 좋습니다.
  5. 언리얼 엔진 Sphere Trace 공격 판정 만들기 → 실제 공격 시스템 구현을 확인할 수 있습니다.

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

위로 스크롤