Unreal Engine 5 - Project Shooter (12): 1인칭 애니메이션 보강 (3)

mingu Lee·2025년 9월 5일

1. 간단 요약


  • 기존 Character Mesh 외에 Lower Body를 추가하여 시점을 아래로 향했을 때 다리 부분이 보이도록 설정.
  • Blend Space를 사용하여 Speed와 State에 따라 Idle, Walk, Run 애니메이션이 재생되도록 설정.
  • Character의 동작에 따라 그림자가 따라 움직일 수 있도록 Shadow Mesh 추가 및 Shadow ABP 설정.
  • IK Rig을 사용하여 Shadow Mesh의 상체가 본 Character의 상체 움직임을 따라할 수 있도록 설정.
  • 시점이 위, 아래로 향했을 때 상체도 위, 아래를 향할 수 있도록 Aim Offset Asset 생성 및 적용

2. 세부 과정


  1. Lower Body 추가
  2. Blend Space를 통한 Idle, Walk, Run 애니메이션 재생
  3. Shadow Mesh
  4. IK Rig 설정
  5. Aim Offset

2-1. Lower Body 추가


기존 Character는 Skeletal Mesh가 카메라 안에 존재하기 때문에 카메라의 Pitch가 회전할 경우 Character 또한 회전하게 됨.

즉, 카메라를 아래로 내려도 몸통을 확인할 수 없는 문제가 발생.

이를 방지하기 위해 기존 Character Mesh와 똑같은 Lower Body라는 Skeletal Mesh를 추가하여 Capsule Component 자식으로 설정하고, 상체는 보이지 않도록 Spine_03를 기준으로 Bone을 숨김.

너무 내리면 몸통이 뚫려서 보이는 문제가 발생하기 때문에, PlayerCameraManager 기반의 BP를 생성하여 최소 Pitch를 -60, 최대 Pitch를 90으로 설정 후 Player Contoller에 설정.

이렇게 하면 카메라의 Pitch를 위, 아래로 회전시켜도 최소 -60, 최대 90까지만 회전할 수 있게 됨.

2-2. Blend Space를 통한 Idle, Walk, Run 애니메이션 재생


현재 상태는 Run 외에 움직일 시 다리가 움직이지 않고 Idle 애니메이션 상태로 움직임.

이를 해결하기 위해 Retargeting 했던 애니메이션 중 Walk 애니메이션을 가져옴.

Lower Body라는 State Machine을 만들고, Idle/Walk State와 Run State를 생성함.

Idle or Walk State에는 Blend Space를 생성하여 Speed 값에 따라 Idle 또는 Walk 애니메이션이 재생되도록 설정.

Speed 값은 Character에서 현재 속도의 길이를 Return해주는 GetSpeed 함수를 만들어서 Event Graph에서 초기화해줌.

이렇게 만든 Lower Body State Machine과 기존에 만들었던 Main·Sub Weapon State Machine을 Blend 시켜주어야 함.

기존 움직임에 다리가 움직이는 것을 Blend 시켜야하기 때문에 Layered blend per bone 노드를 사용하여 Base Pose는 Weapon State Machine으로, Base Poses는 Lower Body로 설정.

Layered blend per bone 노드의 Layer Setup은 2개를 추가하여 왼쪽, 오른쪽 다리인 thigh_l, thigt_r로 설정함.

Idle, Walk, Run에 따라 다리 애니메이션이 제대로 재생되는 것을 볼 수 있음.

2-3. Shadow Mesh


현재 기존 Character Mesh, LowerBody Mesh 2개가 있는 상태.

Character Mesh는 카메라에 의해 회전하기 때문에 그림자로 사용하기에 적절하지 않고, LowerBody Mesh는 하반신만 있기 때문에 이 또한 그림자로 사용하기에 적절하기 않음.

따라서, 새로운 Shadow 전용 Mesh를 추가해주어야 함.

이 Mesh는 Game에서 보이면 안 되기 때문에 Hidden in Game 옵션을 활성화하고, 게임에서는 보이지 않지만 그림자는 보여야하기 때문에 Hidden Shadow 옵션을 활성화.

실행해보면 Character, LowerBody Mesh에 의한 그림자는 안 보이고, Shadow Mesh에 의한 그림자만 보이는 것을 확인할 수 있음.

이 Shadow Mesh 또한 기존 Character의 움직임에 의한 애니메이션을 모두 따라해야하기 때문에 Character의 ABP를 복사하여 Shadow Mesh의 ABP를 생성 후 적용.

잘 보면 그림자의 다리는 잘 움직이는데 상체 움직임은 그림자가 따라하지 않는 것을 볼 수 있음.

이는 Character의 ABP와 Shadow의 ABP가 달라서 생기는 문제.

Aim과 Reload, Swap의 Anim Montage는 모두 Character의 ABP에서 Play되고 있음.

Shadow의 ABP에도 Anim Montage를 Play해주면 될 것 같지만, 동작만 따라할 뿐 카메라의 Pitch 회전에 의한 총과 손의 위치 변경은 고려하지 않게 됨.

실제로 노드를 추가하고 테스트해보면 다음과 같이 그림자가 보임.

그림자를 잘 보면 손과 총이 따로 노는 것을 볼 수 있음.

그렇다면 상체의 움직임이 그림자에 적용되게 하려면 어떻게 해야할까?

2-4. IK Rig 설정


바로 이전에 Aim 애니메이션을 만들 때 사용했던 IK Rig Asset을 사용하는 것.

해당 Asset에는 hand에서 clavicle까지 IK가 설정되어 있기 때문에 hand가 움직이면 연결된 Bone들이 따라서 움직임.

이를 활용하여 Character의 손의 Transform 값을 가져와서 IK Rig의 입력 값으로 사용할 수 있도록 구현.

먼저 Character에서 Socket의 Name을 인자로 받아 Transform 값을 return해주는 GetSocketTransform 함수 생성.

Shadow ABP의 Event Graph에서 Left Hand와 Right Hand 변수를 생성하고, GetSocketTransform 함수를 통해 값을 저장.

이후 Anim Graph에서 IK Rig 노드를 추가하고 입력 값을 설정해주면 됨.

이렇게 하면 손의 위치에 따라 Shadow의 상체도 자연스럽게 움직일 수 있게 됨.

2-5. Aim Offset


카메라를 위, 아래로 회전했을 때 Character의 상체 또한 위, 아래를 볼 수 있도록 Aim Offset을 사용.

Vertical Axis를 Pitch로 설정하고 값에 따라 Retargeting 했던 애니메이션 중 위, 중간, 아래를 바라보는 Idle 애니메이션을 배치.

Pitch 값이 양수일 때Pitch 값이 음수일 때

Anim Graph에서 AimOffset Player라는 노드를 사용하여 위에서 만든 Aim Offset Asset을 적용.

Event Graph에서 Character의 Get Base Aim Rotaion 노드를 통해 Pitch 값을 받아와 변수로 저장하고, AimOffset Player 노드의 Pitch 값으로 설정 및 State Machine 연결.

실행해보면 Charcater의 그림자가 카메라의 Pitch 회전에 따라 회전하는 것을 볼 수 있음.

3. 구현 중 발생한 문제 및 해결방안


오늘은 구현 중 특이사항 없음.

4. 오늘의 결과물


profile
Github: https://github.com/dlalsrn

0개의 댓글