19. 애니메이션 기반 동작 확인용 Preview Pawn 구현(1)

date
3월 31, 2026
status
완료
tags
unrealRL

1. 목적#

이전 단계에서는 기존 애니메이션을 통해 로봇의 기본 자세, 관절 가동 범위, 상부 몸체 움직임을 먼저 확인하는 작업을 계획해보았으니, 이번 단계에서는 이를 실제로 확인하기 위해, 학습용 BP_SpiderRobot과는 별도로 애니메이션 확인용 Preview Pawn을 구성해보도록 하자.

이 Preview Pawn은 강화학습에 직접 사용되는 로봇이 아니다. 기존 에셋에 포함된 Idle, 전진, 후진, 좌우 이동, 착지 애니메이션을 직접 재생하면서, 모델이 원래 어떤 방식으로 움직이도록 제작되었는지 확인하기 위한 테스트용 Pawn이다.

특히 현재 학습 중에는 로봇이 앞으로 이동하려고 시도하는 과정에서 상부 몸체가 크게 고꾸라진 뒤 다시 안정적인 자세로 복귀하지 못하는 문제가 있었다. 따라서 이번 Preview Pawn에서는 다음 항목을 중점적으로 확인한다.

확인 항목확인 목적
Root_MTop_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_SpiderAnimPreviewPawnSpiderMesh에는 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 ModeUse Animation Blueprint로 설정하는 이유는 이 Skeletal Mesh가 고정된 애니메이션 하나만 재생하는 것이 아니라, ABP_SpiderPreview 안의 State Machine을 통해 입력에 따라 여러 애니메이션을 전환해야 하기 때문이다.

  • Anim Class에는 앞에서 만든 ABP_SpiderPreview를 지정한다.

  • 이렇게 설정하면 BP_SpiderAnimPreviewPawn 안의 SpiderMeshABP_SpiderPreview를 통해 Idle, 전진, 후진, 좌우 이동, Landing 애니메이션을 재생할 수 있는 상태가 된다.


2.4. IMC_SpiderPreview 생성#

  • 이제 BP_SpiderAnimPreviewPawn이 WASD, Space, Mouse 입력을 받을 수 있도록 Enhanced Input 에셋을 생성해보자.

    입력 에셋Value Type역할
    IA_MoveAxis2DW/S/A/D 이동 입력
    IA_LookAxis2DMouse X/Y 상부 몸체 회전 입력
    IA_LandingBooleanSpace 착지/점프 계열 테스트 입력
    IMC_SpiderPreviewInput Mapping Context위 Input Action들을 실제 키에 연결
  • 여기서 IA_MoveAxis2D로 만드는 이유는 이동 입력을 하나의 2차원 벡터로 다루기 위해서다.

    IA_Move.X = 좌우 이동 입력
    IA_Move.Y = 전후 이동 입력

    예를 들어 W를 누르면 전진 입력, D를 누르면 우측 입력이 들어오고, W+D를 동시에 누르면 전진과 우측 입력이 함께 들어온다. 게임패드 스틱을 사용할 경우에는 0.3, 0.5처럼 중간 입력값도 받을 수 있기 때문에, 이후 이동 속도나 애니메이션 블렌딩을 더 자연스럽게 확장할 수 있다.

    입력 상태IA_Move 값
    WX = 0, Y = 1
    SX = 0, Y = -1
    AX = -1, Y = 0
    DX = 1, Y = 0
    W + DX = 1, Y = 1
    게임패드 스틱 30% 전진X = 0, Y = 0.3
    게임패드 스틱 대각선 입력X = 0.5, Y = 0.5
  • 이 값은 이후 MoveRightValue, MoveForwardValue로 분리한 뒤 2D Blend Space의 입력값으로 사용한다. 이렇게 하면 키 입력을 단순히 애니메이션 상태 전환 조건으로만 쓰는 것이 아니라, 여러 이동 애니메이션을 자연스럽게 섞는 블렌딩 값으로 사용할 수 있다.

  • IA_LookAxis2D로 구성한다. 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_MoveAxis2D니까 키마다 X/Y 방향값을 다르게 줘야 함. 보통 Enhanced Input에서는 각 키에 Modifier를 붙여서 방향을 만들어보자

  • W

  • A

  • S

  • D

  • 정리

    KeyModifier
    WSwizzle Input Axis Values → Y
    SSwizzle Input Axis Values → Y + Negate
    D기본 X 방향
    ANegate

마우스 상하 방향이 기대한 것과 반대로 움직일 경우, Mapping Context에서 바로 Negate를 추가하기보다는 이후 BP_SpiderAnimPreviewPawnLookPitchSpeed 부호를 바꿔 조정한다.

이렇게 하면 입력 매핑은 그대로 유지하면서, 상하 반전 여부만 변수값으로 쉽게 조절할 수 있다.


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로 넘길 이동 입력
    MoveForwardValueFloat0.0전후 이동값
    MoveRightValueFloat0.0좌우 이동값
    RawLookInputVector2D(0, 0)마우스 입력값
    AimYawFloat0.0상부 몸체 좌우 회전
    AimPitchFloat0.0상부 몸체 상하 회전
    bLandingPressedBooleanfalseSpace 입력 여부
    MoveInterpSpeedFloat8.0이동 입력 보간 속도
    LookYawSpeedFloat1.0마우스 좌우 민감도
    LookPitchSpeedFloat-1.0마우스 상하 민감도
    MaxAimYawFloat30.0좌우 회전 제한
    MaxAimPitchFloat15.0상하 회전 제한
  • 여기서 RawMoveInputSmoothedMoveInput을 나누는 이유는 입력을 바로 애니메이션에 넣으면 너무 딱딱하게 튀기 때문이다

    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 Context
  • Add Mapping Context 값은:

    Mapping Context = IMC_SpiderPreview
    Priority = 0

    그리고 BP_SpiderAnimPreviewPawn의 Details에서 이것도 설정해주자

    Auto Possess Player = Player 0
  • 연결 구조


3. 후기#

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

Be Your Own Lamp