
19. 애니메이션 기반 동작 확인용 Preview Pawn 구현(1)
- date
- 3월 31, 2026
- status
- 완료
- tags
- unrealRL
1. 목적#
이전 단계에서는 기존 애니메이션을 통해 로봇의 기본 자세, 관절 가동 범위, 상부 몸체 움직임을 먼저 확인하는 작업을 계획해보았으니, 이번 단계에서는 이를 실제로 확인하기 위해, 학습용 BP_SpiderRobot과는 별도로 애니메이션 확인용 Preview Pawn을 구성해보도록 하자.
이 Preview Pawn은 강화학습에 직접 사용되는 로봇이 아니다. 기존 에셋에 포함된 Idle, 전진, 후진, 좌우 이동, 착지 애니메이션을 직접 재생하면서, 모델이 원래 어떤 방식으로 움직이도록 제작되었는지 확인하기 위한 테스트용 Pawn이다.
특히 현재 학습 중에는 로봇이 앞으로 이동하려고 시도하는 과정에서 상부 몸체가 크게 고꾸라진 뒤 다시 안정적인 자세로 복귀하지 못하는 문제가 있었다. 따라서 이번 Preview Pawn에서는 다음 항목을 중점적으로 확인한다.
| 확인 항목 | 확인 목적 |
|---|---|
Root_M과 Top_M의 상대 움직임 | 상부 몸체가 하부 기준으로 어느 정도 움직이는지 확인 |
| 다리 관절의 자연스러운 회전 범위 | Action Scale 설정 참고 |
| Idle 기본 자세 | Reset Pose 기준 확인 |
| 전진/후진/좌우 이동 시 몸체 흔들림 | Posture Reward 기준 확인 |
| 착지 시 몸체 변화 | 낙상 판정과 착지 동작 구분 |
2. 구현#
이번 단계에서 구현할 에셋은 다음과 같다.
항목 역할 BP_SpiderAnimPreviewPawnWASD / Space / Mouse 입력을 받는 테스트용 Pawn ABP_SpiderPreview입력값에 따라 Idle, Walk, Landing 애니메이션을 전환하는 Animation Blueprint IA_Move전진, 후진, 좌우 이동 입력 IA_Look마우스를 이용한 상부 몸체 회전 입력 IA_Landing착지 또는 점프 계열 동작 확인용 입력 IMC_SpiderPreviewPreview Pawn 전용 입력 매핑 컨텍스트 전체 구조는 다음과 같다.
flowchart TD Input[WASD / Space / Mouse 입력] --> PreviewPawn[BP_SpiderAnimPreviewPawn] PreviewPawn --> MoveVars[MoveForwardValue<br/>MoveRightValue<br/>bLandingPressed<br/>AimYaw / AimPitch] MoveVars --> AnimBP[ABP_SpiderPreview] AnimBP --> StateMachine[SM_SpiderPreview] StateMachine --> Idle[Idle] StateMachine --> WalkF[WalkForward] StateMachine --> WalkB[WalkBackward] StateMachine --> WalkL[WalkLeft] StateMachine --> WalkR[WalkRight] StateMachine --> Landing[Landing] AnimBP --> TopModify[Transform Modify Bone<br/>Top_M 회전 테스트]BP_SpiderAnimPreviewPawn은 플레이어 입력을 받아 변수로 저장한 후,ABP_SpiderPreview가 이 변수들을 읽어 현재 재생할 애니메이션 상태를 결정하는 흐름으로 만들기로 했다. 기본 애니메이션 전환이 확인된 뒤에는Transform Modify Bone을 이용해Top_M을 마우스로 회전시켜 상부 몸체의 자연스러운 회전 범위를 확인해보자.
2.1. Preview Pawn 생성#
- 먼저 애니메이션 확인용 Pawn을 새로 생성해보자
- Content Browser 우클릭→ Blueprint Class→ Pawn→ 이름: BP_SpiderAnimPreviewPawn
- 여기서 Pawn을 사용하는 이유는 WASD, Space, Mouse 입력을 직접 받아 애니메이션 상태를 전환할 대상이 필요하기 때문이다. 기존
BP_SpiderRobot을 그대로 사용해도 겉보기에는 빠르게 테스트할 수 있지만, 그 경우 Learning Agents 학습용 로직과 애니메이션 테스트용 로직이 한 Blueprint 안에 섞이게 되어 버려서, 이후 학습이 이상하게 동작했을 때 문제가 입력 때문인지, 애니메이션 때문인지, 학습 구조 때문인지 구분하기 어려워진다. - 따라서 이번 확인용 작업은 별도의
BP_SpiderAnimPreviewPawn에서 진행해보도록 하자
2.2. Animation Blueprint 생성#
Preview Pawn에서 애니메이션을 재생하려면, Skeletal Mesh가 사용할 Animation Blueprint가 필요하다.
Animation Blueprint는 단순히 애니메이션 시퀀스 하나를 재생하는 것이 아니라, 입력값에 따라 어떤 애니메이션을 재생할지 결정하는 역할을 한다.
이번 테스트에서는 W/S/A/D 입력에 따라 전진, 후진, 좌우 이동 애니메이션을 전환하고, Space 입력에 따라 Landing 애니메이션을 재생해야 하므로 별도의 Animation Blueprint를 생성해야 한다.
Content Browser 우클릭→ Animation→ Animation Blueprint→ 거미 로봇 Skeleton 선택
(이름: ABP_SpiderPreview)

이 애니메이션 블루프린트는 여러 애니메이션 시퀀스를 입력갑셍 따라 선택하고 전환하는 제어용 블루프린트다
flowchart TD Mesh[SpiderMesh<br/>Skeletal Mesh Component] --> AnimClass[Anim Class<br/>ABP_SpiderPreview] AnimClass --> StateMachine[SM_SpiderPreview] StateMachine --> Idle[A_ISO_Mech_Idle_01] StateMachine --> WalkF[A_ISO_Mech_WalkForward_01] StateMachine --> WalkB[A_ISO_Mech_WalkBackward_01] StateMachine --> WalkL[A_ISO_Mech_Walk_L_01] StateMachine --> WalkR[A_ISO_Mech_Walk_R_01] StateMachine --> Landing[A_ISO_Mech_Landing_01]즉
SpiderMesh는 로봇의 외형과 Skeleton을 가진 컴포넌트이고,ABP_SpiderPreview는 그 Skeleton을 어떤 애니메이션으로 움직일지 결정하는 애니메이션 제어기라고 볼 수 있다.따라서 이후
BP_SpiderAnimPreviewPawn의SpiderMesh에는Animation Mode = Use Animation Blueprint,Anim Class = ABP_SpiderPreview를 지정해줘야 한다.
2.3. Skeletal Mesh 연결#
BP_SpiderAnimPreviewPawn을 열고 Components 패널에서 Skeletal Mesh Component를 추가(Add Component→ Skeletal Mesh→ 이름: SpiderMesh)

이후
SpiderMesh를 선택하고 Details 패널에서 현재 거미 로봇 Skeletal Mesh를 지정 후 아래와 같이 설정 수정Skeletal Mesh = 현재 거미 로봇 메시 Animation Mode = Use Animation Blueprint Anim Class = ABP_SpiderPreview여기서
Animation Mode를Use Animation Blueprint로 설정하는 이유는 이 Skeletal Mesh가 고정된 애니메이션 하나만 재생하는 것이 아니라,ABP_SpiderPreview안의 State Machine을 통해 입력에 따라 여러 애니메이션을 전환해야 하기 때문이다.Anim Class에는 앞에서 만든ABP_SpiderPreview를 지정한다.이렇게 설정하면
BP_SpiderAnimPreviewPawn안의SpiderMesh가ABP_SpiderPreview를 통해 Idle, 전진, 후진, 좌우 이동, Landing 애니메이션을 재생할 수 있는 상태가 된다.
2.4. IMC_SpiderPreview 생성#
이제
BP_SpiderAnimPreviewPawn이 WASD, Space, Mouse 입력을 받을 수 있도록 Enhanced Input 에셋을 생성해보자.입력 에셋 Value Type 역할 IA_MoveAxis2D W/S/A/D 이동 입력 IA_LookAxis2D Mouse X/Y 상부 몸체 회전 입력 IA_LandingBoolean Space 착지/점프 계열 테스트 입력 IMC_SpiderPreviewInput Mapping Context 위 Input Action들을 실제 키에 연결 여기서
IA_Move를Axis2D로 만드는 이유는 이동 입력을 하나의 2차원 벡터로 다루기 위해서다.IA_Move.X = 좌우 이동 입력 IA_Move.Y = 전후 이동 입력예를 들어 W를 누르면 전진 입력, D를 누르면 우측 입력이 들어오고, W+D를 동시에 누르면 전진과 우측 입력이 함께 들어온다. 게임패드 스틱을 사용할 경우에는 0.3, 0.5처럼 중간 입력값도 받을 수 있기 때문에, 이후 이동 속도나 애니메이션 블렌딩을 더 자연스럽게 확장할 수 있다.
입력 상태 IA_Move 값 W X = 0, Y = 1 S X = 0, Y = -1 A X = -1, Y = 0 D X = 1, Y = 0 W + D X = 1, Y = 1 게임패드 스틱 30% 전진 X = 0, Y = 0.3 게임패드 스틱 대각선 입력 X = 0.5, Y = 0.5 이 값은 이후
MoveRightValue,MoveForwardValue로 분리한 뒤 2D Blend Space의 입력값으로 사용한다. 이렇게 하면 키 입력을 단순히 애니메이션 상태 전환 조건으로만 쓰는 것이 아니라, 여러 이동 애니메이션을 자연스럽게 섞는 블렌딩 값으로 사용할 수 있다.IA_Look도Axis2D로 구성한다. Mouse X는 상부 몸체의 좌우 회전, Mouse Y는 상하 회전에 사용한다. 이 값은 이후Top_M본을 회전시키거나, 상부 몸체의 조준/시선 방향을 확인하는 데 활용한다.IA_Landing은 Space 입력을 별도의 Boolean으로 둔다. 이동 입력과 착지/점프 입력을 분리해 두면, 나중에 이동 중 착지나 점프 동작을 별도 레이어처럼 섞는 구조로 확장할 수 있다.더블클릭해서 열고, Mapping 목록에
+로 매핑을 추가
2.5. IA_Move에 WASD 매핑#
IA_Move를 추가한 뒤, 그 안에 키를 4개 입력Key 설정 의미 W 전진 S 후진 A 좌측 D 우측 여기서
IA_Move는Axis2D니까 키마다 X/Y 방향값을 다르게 줘야 함. 보통 Enhanced Input에서는 각 키에 Modifier를 붙여서 방향을 만들어보자W

A

S

D

정리
Key Modifier W Swizzle Input Axis Values → Y S Swizzle Input Axis Values → Y + Negate D 기본 X 방향 A Negate
마우스 상하 방향이 기대한 것과 반대로 움직일 경우, Mapping Context에서 바로 Negate를 추가하기보다는 이후 BP_SpiderAnimPreviewPawn의 LookPitchSpeed 부호를 바꿔 조정한다.
이렇게 하면 입력 매핑은 그대로 유지하면서, 상하 반전 여부만 변수값으로 쉽게 조절할 수 있다.
2.6. IA_Look에 Mouse X/Y 매핑#
IA_Look은 마우스 입력을 받아 상부 몸체 회전에 사용할 입력 액션이다. IA_Move와 마찬가지로 Axis2D 타입으로 만들었기 때문에 Mouse X와 Mouse Y를 하나의 2차원 입력값으로 받을 수 있다.
Mouse X는 기본적으로 X축 입력으로 들어오므로 별도의 Modifier를 추가하지 않는다. 이 값은 이후 AimYaw에 반영하여 Top_M의 좌우 회전에 사용한다.
Mouse Y는 상하 회전에 사용할 값이므로 Y축 입력으로 들어오도록 Swizzle Input Axis Values를 추가하고, Order는 YXZ로 설정한다. 이 값은 이후 AimPitch에 반영하여 Top_M의 상하 회전에 사용한다.
IA_Look 매핑은 최종적으로 다음과 같다

정리
IA_Look ├─ Mouse X │ └─ Modifier 없음 │ └─ Mouse Y └─ Swizzle Input Axis Values └─ Order = YXZ
2.7. IA_Landing에 Space Bar 매핑#
IA_Landing은 Boolean이니까 간단하게 스페이스 바를 등록해주자IA_Landing → Space Bar
2.8. Preview Pawn 입력 변수 생성#
BP_SpiderAnimPreviewPawn을 열고 변수를 만들자변수명 타입 기본값 용도 RawMoveInputVector2D (0, 0)Enhanced Input에서 받은 원본 이동 입력 SmoothedMoveInputVector2D (0, 0)보간 후 AnimBP로 넘길 이동 입력 MoveForwardValueFloat 0.0전후 이동값 MoveRightValueFloat 0.0좌우 이동값 RawLookInputVector2D (0, 0)마우스 입력값 AimYawFloat 0.0상부 몸체 좌우 회전 AimPitchFloat 0.0상부 몸체 상하 회전 bLandingPressedBoolean falseSpace 입력 여부 MoveInterpSpeedFloat 8.0이동 입력 보간 속도 LookYawSpeedFloat 1.0마우스 좌우 민감도 LookPitchSpeedFloat -1.0마우스 상하 민감도 MaxAimYawFloat 30.0좌우 회전 제한 MaxAimPitchFloat 15.0상하 회전 제한 여기서
RawMoveInput과SmoothedMoveInput을 나누는 이유는 입력을 바로 애니메이션에 넣으면 너무 딱딱하게 튀기 때문이다W 누름 → RawMoveInput.Y가 바로 1이 됨 → 그대로 쓰면 Idle에서 Walk로 갑자기 튐그래서 실제 AnimBP에는
RawMoveInput을 바로 넘기지 않고,SmoothedMoveInput을 넘긴다.RawMoveInput = 실제 키 입력 SmoothedMoveInput = 부드럽게 보간된 애니메이션용 입력
2.9. Mapping Context를 Preview Pawn에 등록#
그 다음
BP_SpiderAnimPreviewPawn의 Event Graph에서IMC_SpiderPreview를 아래와 같이 등록해보자flowchart TD BeginPlay[Event BeginPlay] --> Controller[Get Controller] Controller --> CastPC[Cast To PlayerController] CastPC --> LocalPlayer[Get Local Player] LocalPlayer --> Subsystem[Get Enhanced Input Local Player Subsystem] Subsystem --> AddContext[Add Mapping Context<br/>IMC_SpiderPreview]노드 순서로 쓰면:
Event BeginPlay → Get Controller → Cast To PlayerController → Get Local Player → Get Enhanced Input Local Player Subsystem → Add Mapping ContextAdd Mapping Context값은:Mapping Context = IMC_SpiderPreview Priority = 0그리고
BP_SpiderAnimPreviewPawn의 Details에서 이것도 설정해주자Auto Possess Player = Player 0연결 구조

3. 후기#
양이 너무 많아서 다음 장에서 계속 작성해보도록 하자