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

date
4월 4, 2026
status
완료
tags
unrealRL

1. 이어서…#

이어서 작성을 진행해보자

2. 구현#


2.15. AnimBP에서 Preview Pawn 입력값 읽기#

  • 이제 BP_SpiderAnimPreviewPawn에서 처리한 입력값을 ABP_SpiderPreview에서 읽어오도록 구성해주자
  • 지금까지 입력값은 Preview Pawn 내부 변수에 저장되어 있다.
  • 하지만 실제 애니메이션을 재생하는 것은 ABP_SpiderPreview이므로, AnimBP가 Preview Pawn의 값을 읽어와야 2D Blend Space나 Top_M 본 회전에 사용할 수 있다.

현재 Preview Pawn 쪽에서 준비한 주요 값은 다음과 같다.

변수명의미AnimBP에서의 사용처
MoveRightValue좌우 이동 입력2D Blend Space X축
MoveForwardValue전후 이동 입력2D Blend Space Y축
AimYaw상부 몸체 좌우 회전값Top_M Yaw 회전
AimPitch상부 몸체 상하 회전값Top_M Pitch 회전
bLandingPressedLanding 입력 요청Landing / Jump 계열 애니메이션 조건

따라서 ABP_SpiderPreview에도 같은 이름의 변수를 만들어주자.

변수명타입용도
MoveRightValueFloatBlend Space 좌우 입력
MoveForwardValueFloatBlend Space 전후 입력
AimYawFloat상부 몸체 좌우 회전
AimPitchFloat상부 몸체 상하 회전
bLandingPressedBooleanLanding / Jump 계열 입력 상태

Event Blueprint Update Animation 구성#

  • ABP_SpiderPreview를 열고 Event Graph로 이동한다.

  • Event Blueprint Update Animation에서 현재 Animation Blueprint가 붙어 있는 Pawn을 가져와주자

  • 이후 이 Pawn을 BP_SpiderAnimPreviewPawn으로 Cast하고, Preview Pawn 안의 변수값을 AnimBP 변수에 복사한다.

  • 연결은 다음과 같이 구성해주자

    Event Blueprint Update Animation / 실행 출력핀
    → Cast To BP_SpiderAnimPreviewPawn / 실행 입력핀
    
    Try Get Pawn Owner / Return Value
    → Cast To BP_SpiderAnimPreviewPawn / Object 입력핀

    여기서 Try Get Pawn Owner는 현재 AnimBP를 사용 중인 Skeletal Mesh가 어떤 Pawn에 속해 있는지 가져오는 노드다.

    Preview Pawn의 SpiderMeshABP_SpiderPreview를 연결했으므로, 정상적으로 연결되어 있다면 Try Get Pawn OwnerBP_SpiderAnimPreviewPawn을 반환하게 된다.


이동 입력값 읽기#

Cast가 성공하면 Preview Pawn의 이동 입력값을 AnimBP 변수에 저장하자

Cast To BP_SpiderAnimPreviewPawn / As BP_SpiderAnimPreviewPawn
→ Get MoveRightValue / Target 입력핀

Get MoveRightValue / Return Value
→ Set MoveRightValue / MoveRightValue 입력핀

실행핀은 다음과 같이 연결한다.

Cast To BP_SpiderAnimPreviewPawn / 실행 출력핀
→ Set MoveRightValue / 실행 입력핀

그 다음 전후 입력값도 저장한다.

Cast To BP_SpiderAnimPreviewPawn / As BP_SpiderAnimPreviewPawn
→ Get MoveForwardValue / Target 입력핀

Get MoveForwardValue / Return Value
→ Set MoveForwardValue / MoveForwardValue 입력핀

실행핀은 다음과 같이 이어준다.

Set MoveRightValue / 실행 출력핀
→ Set MoveForwardValue / 실행 입력핀

상부 몸체 회전값 읽기#

다음으로 AimYaw, AimPitch 값을 AnimBP 변수에 저장한다.

Cast To BP_SpiderAnimPreviewPawn / As BP_SpiderAnimPreviewPawn
→ Get AimYaw / Target 입력핀

Get AimYaw / Return Value
→ Set AimYaw / AimYaw 입력핀

실행핀은 다음과 같이 이어준다.

Set MoveForwardValue / 실행 출력핀
→ Set AimYaw / 실행 입력핀

AimPitch도 같은 방식으로 가져온다.

Cast To BP_SpiderAnimPreviewPawn / As BP_SpiderAnimPreviewPawn
→ Get AimPitch / Target 입력핀

Get AimPitch / Return Value
→ Set AimPitch / AimPitch 입력핀

실행핀은 다음과 같이 이어준다.

Set AimYaw / 실행 출력핀
→ Set AimPitch / 실행 입력핀

Landing 입력값 읽기#

마지막으로 bLandingPressed 값을 AnimBP 변수에 저장한다.

Cast To BP_SpiderAnimPreviewPawn / As BP_SpiderAnimPreviewPawn
→ Get bLandingPressed / Target 입력핀

Get bLandingPressed / Return Value
→ Set bLandingPressed / bLandingPressed 입력핀

실행핀은 다음과 같이 이어준다.

Set AimPitch / 실행 출력핀
→ Set bLandingPressed / 실행 입력핀

최종 연결 구조#

정리하면 ABP_SpiderPreview의 Event Graph에서는 다음과 같은 흐름으로 Preview Pawn의 값을 읽어온다.

Event Blueprint Update Animation / 실행 출력핀
→ Cast To BP_SpiderAnimPreviewPawn / 실행 입력핀

Try Get Pawn Owner / Return Value
→ Cast To BP_SpiderAnimPreviewPawn / Object 입력핀

Cast To BP_SpiderAnimPreviewPawn / 실행 출력핀
→ Set MoveRightValue / 실행 입력핀

Cast To BP_SpiderAnimPreviewPawn / As BP_SpiderAnimPreviewPawn
→ Get MoveRightValue / Target 입력핀

Get MoveRightValue / Return Value
→ Set MoveRightValue / MoveRightValue 입력핀

Set MoveRightValue / 실행 출력핀
→ Set MoveForwardValue / 실행 입력핀

Cast To BP_SpiderAnimPreviewPawn / As BP_SpiderAnimPreviewPawn
→ Get MoveForwardValue / Target 입력핀

Get MoveForwardValue / Return Value
→ Set MoveForwardValue / MoveForwardValue 입력핀

Set MoveForwardValue / 실행 출력핀
→ Set AimYaw / 실행 입력핀

Cast To BP_SpiderAnimPreviewPawn / As BP_SpiderAnimPreviewPawn
→ Get AimYaw / Target 입력핀

Get AimYaw / Return Value
→ Set AimYaw / AimYaw 입력핀

Set AimYaw / 실행 출력핀
→ Set AimPitch / 실행 입력핀

Cast To BP_SpiderAnimPreviewPawn / As BP_SpiderAnimPreviewPawn
→ Get AimPitch / Target 입력핀

Get AimPitch / Return Value
→ Set AimPitch / AimPitch 입력핀

Set AimPitch / 실행 출력핀
→ Set bLandingPressed / 실행 입력핀

Cast To BP_SpiderAnimPreviewPawn / As BP_SpiderAnimPreviewPawn
→ Get bLandingPressed / Target 입력핀

Get bLandingPressed / Return Value
→ Set bLandingPressed / bLandingPressed 입력핀

구조로 표현하면 다음과 같다.

flowchart TD
    Update[Event Blueprint Update Animation] --> Owner[Try Get Pawn Owner]
    Owner --> Cast[Cast To BP_SpiderAnimPreviewPawn]

    Cast --> MoveRight[Set MoveRightValue]
    Cast --> MoveForward[Set MoveForwardValue]
    Cast --> AimYaw[Set AimYaw]
    Cast --> AimPitch[Set AimPitch]
    Cast --> Landing[Set bLandingPressed]

이 단계가 완료되면 BP_SpiderAnimPreviewPawn에서 처리한 입력값이 ABP_SpiderPreview 안으로 전달된다.

다음 단계에서는 MoveRightValue, MoveForwardValue를 이용해 2D Blend Space를 구동하고, AimYaw, AimPitch를 이용해 Top_M 본을 회전시키는 구조를 만든다.


2.16. 이동 애니메이션용 2D Blend Space 생성#

  • 이제 ABP_SpiderPreview에서 읽어온 MoveRightValue, MoveForwardValue를 실제 이동 애니메이션에 연결하기 위해 2D Blend Space를 생성해보자
  • Blend Space를 사용하는 이유는 전진, 후진, 좌우 이동 애니메이션을 각각 따로 전환하는 것이 아니라, 입력 방향에 따라 자연스럽게 섞기 위해서다.
  • 예를 들어 W만 누르면 전진 애니메이션이 재생되고, D만 누르면 우측 이동 애니메이션이 재생된다.
  • W와 D를 동시에 누르면 전진 애니메이션과 우측 이동 애니메이션이 함께 섞인 결과를 확인할 수 있다.

즉 이번 구조는 다음과 같다.

MoveRightValue   = 좌우 이동 입력
MoveForwardValue = 전후 이동 입력

MoveRightValue / MoveForwardValue
→ 2D Blend Space 입력값
→ Idle / Forward / Backward / Left / Right 애니메이션 블렌딩

BS_SpiderMove 생성#

  • Content Browser에서 거미 로봇 애니메이션을 관리하는 폴더로 이동한다.
  • 이후 다음 에셋을 생성한다.
Content Browser 우클릭
→ Animation
→ Blend Space
→ 거미 로봇 Skeleton 선택
→ 이름: BS_SpiderMove

좌우 이동과 전후 이동을 동시에 다루기 위해서는 2개의 축이 필요하기 때문이다.


Blend Space 축 설정#

BS_SpiderMove를 열고, Axis Settings를 다음과 같이 설정해주자

이름MinMax의미
Horizontal AxisMoveRight-1.01.0좌우 이동
Vertical AxisMoveForward-1.01.0전후 이동

각 값의 의미는 다음과 같다.

의미
MoveRight = -1좌측 이동
MoveRight = 0좌우 입력 없음
MoveRight = 1우측 이동
MoveForward = -1후진
MoveForward = 0전후 입력 없음
MoveForward = 1전진

이렇게 설정하면 MoveRightValue, MoveForwardValue를 그대로 Blend Space의 입력값으로 사용할 수 있다.


애니메이션 배치#

Blend Space Grid에는 기존 애니메이션을 다음과 같이 배치해주자

위치애니메이션
X = 0, Y = 0A_ISO_Mech_Idle_01
X = 0, Y = 1A_ISO_Mech_WalkForward_01
X = 0, Y = -1A_ISO_Mech_WalkBackward_01
X = -1, Y = 0A_ISO_Mech_Walk_L_01
X = 1, Y = 0A_ISO_Mech_Walk_R_01

배치 구조를 그림으로 보면 다음과 같다.

              MoveForward +1
                    |
                    |
          WalkForward
                    |
                    |
MoveRight -1 --- Idle --- MoveRight +1
  Walk_L          |          Walk_R
                    |
                    |
          WalkBackward
                    |
              MoveForward -1

이 구조를 사용하면 입력값에 따라 다음과 같은 결과를 얻을 수 있다.

입력Blend Space 입력값결과
입력 없음(0, 0)Idle
W(0, 1)전진
S(0, -1)후진
A(-1, 0)좌측 이동
D(1, 0)우측 이동
W + D(1, 1) 근처전진 + 우측 이동 블렌딩
W + A(-1, 1) 근처전진 + 좌측 이동 블렌딩

현재 에셋에는 대각선 전용 애니메이션이 따로 없기 때문에, W+D 입력이 완벽한 대각 보행 애니메이션으로 재생되는 것은 아니다.

하지만 전진과 우측 이동 애니메이션이 섞이면서, 입력 방향이 섞였을 때 모델의 자세와 관절 움직임이 어떻게 변하는지 확인할 수 있다.


이 단계의 의미#

이전까지는 입력값을 BP_SpiderAnimPreviewPawn에서 받아 ABP_SpiderPreview로 전달하는 구조를 만들었다.

이번 단계에서는 그 입력값을 실제 애니메이션 재생에 사용할 수 있도록 BS_SpiderMove를 준비한다.

정리하면 흐름은 다음과 같다.

flowchart TD
    Input[WASD 입력] --> Pawn[BP_SpiderAnimPreviewPawn]
    Pawn --> Raw[RawMoveInput]
    Raw --> Smooth[SmoothedMoveInput]
    Smooth --> Values[MoveRightValue / MoveForwardValue]
    Values --> AnimBP[ABP_SpiderPreview]
    AnimBP --> Blend[BS_SpiderMove]
    Blend --> Pose[이동 애니메이션 포즈]

이 단계가 완료되면 다음으로 ABP_SpiderPreview의 AnimGraph에서 BS_SpiderMove를 배치하고, MoveRightValue, MoveForwardValue를 Blend Space 입력값으로 연결한다.


2.17. AnimGraph에 BS_SpiderMove 연결#

  • 이제 앞에서 만든 BS_SpiderMoveABP_SpiderPreview의 AnimGraph에 연결해보자.
  • 2.16에서는 전후좌우 이동 애니메이션을 섞기 위한 Blend Space 에셋을 만들었다.
  • 하지만 Blend Space 에셋을 만들기만 해서는 실제 로봇 애니메이션에 적용되지 않는다.
  • ABP_SpiderPreview의 AnimGraph에서 BS_SpiderMove를 배치하고, MoveRightValue, MoveForwardValue를 입력으로 연결해야 실제 포즈가 출력된다.

현재 입력값 흐름은 다음과 같다.

BP_SpiderAnimPreviewPawn
→ MoveRightValue / MoveForwardValue 계산
→ ABP_SpiderPreview에서 값 읽기
→ BS_SpiderMove 입력값으로 사용
→ Output Pose로 출력

BS_SpiderMove 노드 추가#

  • ABP_SpiderPreview를 열고 AnimGraph로 이동
  • 빈 공간에서 우클릭 후 BS_SpiderMove를 검색해 Blend Space 노드를 추가
  • 이후 BS_SpiderMove의 Pose 출력핀을 Output Pose의 Result 입력핀에 연결

연결은 다음과 같이 구성해주자

BS_SpiderMove / Pose 출력핀 → Output Pose / Result 입력핀

Blend Space 입력값 연결#

  • BS_SpiderMove에는 앞에서 설정한 두 축이 있다.
Blend Space 입력의미연결할 AnimBP 변수
MoveRight좌우 이동 입력MoveRightValue
MoveForward전후 이동 입력MoveForwardValue
  • MoveRightValue는 좌우 이동값이므로 BS_SpiderMoveMoveRight 입력핀에 연결
  • MoveForwardValue는 전후 이동값이므로 BS_SpiderMoveMoveForward 입력핀에 연결

연결은 다음과 같이 구성해주자

MoveRightValue / 출력핀 → BS_SpiderMove / MoveRight 입력핀

MoveForwardValue / 출력핀 → BS_SpiderMove / MoveForward 입력핀

최종 연결 구조는 다음과 같다.

MoveRightValue → BS_SpiderMove / MoveRight

MoveForwardValue → BS_SpiderMove / MoveForward

BS_SpiderMove / Pose → Output Pose / Result

구조로 표현하면 다음과 같다.

flowchart TD
    Right[MoveRightValue] --> BS[BS_SpiderMove]
    Forward[MoveForwardValue] --> BS
    BS --> Output[Output Pose]

이 단계의 의미#

이전 단계까지는 입력값을 계산하고 AnimBP 안으로 전달하는 구조를 만들었다.

이번 단계에서는 그 입력값을 실제 이동 애니메이션에 반영한다.

이제 MoveRightValue, MoveForwardValue 값에 따라 BS_SpiderMove가 다음 애니메이션들을 자동으로 섞어준다.

입력기대 애니메이션
입력 없음Idle
WWalkForward
SWalkBackward
AWalk_L
DWalk_R
W + DWalkForward + Walk_R 블렌딩
W + AWalkForward + Walk_L 블렌딩

이 단계가 완료되면 WASD 입력에 따라 Preview Pawn의 이동 애니메이션이 자연스럽게 전환되는지 확인할 수 있다.

아직 Top_M 마우스 회전이나 Landing 애니메이션은 연결하지 않는다.

먼저 지상 이동용 Blend Space가 정상적으로 동작하는지 확인하는 것이 이번 단계의 목표다.


2.18. 애니메이션 Preview 전용 레벨 생성#

  • 이제 BP_SpiderAnimPreviewPawn을 실제 레벨에 배치해 WASD 입력과 Blend Space 애니메이션 전환이 정상적으로 동작하는지 확인해보자.

  • 다만 기존 학습용 레벨인 TestArena에는 이미 BP_SpiderRobot, BP_SpiderTrainingManager, Learning Agents 관련 구성이 들어가 있다.

  • 이 상태에서 Preview Pawn까지 같은 레벨에 배치하면, 이후 문제가 발생했을 때 원인을 구분하기 어려워진다.

예를 들어 입력이 동작하지 않을 때 다음 중 어느 쪽 문제인지 헷갈릴 수 있다.

가능 원인설명
Preview Pawn 입력 문제IMC_SpiderPreview 등록 또는 Auto Possess Player 문제
AnimBP 문제ABP_SpiderPreview에서 변수 전달 또는 Blend Space 연결 문제
기존 학습 구조 문제BP_SpiderTrainingManager 또는 Learning Agents 루프와의 충돌
기존 로봇 Actor 문제BP_SpiderRobot과 Preview Pawn이 동시에 존재하면서 입력 대상이 꼬이는 문제

따라서 이번 애니메이션 확인 작업은 기존 학습용 TestArena가 아니라, 별도의 Preview 전용 레벨에서 진행해보자


새 레벨 생성#

먼저 새 레벨을 만들어주자

File→ New Level→ Basic→ Save As→ L_SpiderAnimPreview(레벨 이름)

이 레벨은 강화학습을 실행하는 레벨이 아니라, 기존 애니메이션과 입력 처리 구조를 확인하기 위한 테스트 레벨이다.


Preview Pawn 배치#

새로 만든 L_SpiderAnimPreview 레벨에 BP_SpiderAnimPreviewPawn을 배치해주자

Content Browser
→ BP_SpiderAnimPreviewPawn
→ 레벨에 드래그 앤 드롭

입력 소유 설정 확인#

BP_SpiderAnimPreviewPawn을 선택하고 Details 패널에서 다음 값을 확인해주자

Auto Possess Player(플레이어 자동 빙의) = Player 0

이 설정을 해야 Play를 눌렀을 때 플레이어 입력이 Preview Pawn으로 들어간다.

만약 이 값이 설정되어 있지 않으면 IMC_SpiderPreview를 등록했더라도 WASD, Mouse, Space 입력이 Pawn에 전달되지 않을 수 있다.



Preview 카메라 구성#

  • WASD 입력과 Blend Space 전환을 확인하려면 로봇을 가까운 위치에서 안정적으로 볼 수 있는 카메라가 필요하다.
  • 기본 에디터 카메라나 PlayerStart 기준 시점만 사용하면 로봇의 다리 움직임, 몸체 흔들림, 상부 차체의 회전 상태를 관찰하기 어렵다.
  • 따라서 BP_SpiderAnimPreviewPawn 안에 Preview 전용 3인칭 카메라를 추가해주자

구성은 다음과 같이 잡아주자

BP_SpiderAnimPreviewPawn
├─ DefaultSceneRoot
├─ SpiderMesh
└─ CameraBoom
   └─ FollowCamera

CameraBoom은 Spring Arm Component이고, FollowCamera는 Camera Component이다.

Spring Arm을 사용하는 이유는 카메라를 로봇 뒤쪽 일정 거리에서 따라오게 만들기 위해서다. 이렇게 하면 Play 중에도 로봇의 움직임을 뒤쪽에서 안정적으로 확인할 수 있다.


Spring Arm 추가#

BP_SpiderAnimPreviewPawn을 열고 Components 패널에서 Spring Arm을 추가해주자

폰의 뷰포트 화면으로 넘어와서 이후 CameraBoom의 기본값을 다음과 같이 설정해주자

Target Arm Length = 500
Relative Location = X 0, Y 0, Z 160
Relative Rotation = Pitch -10, Yaw 0, Roll 0
Do Collision Test = false

각 값의 의미는 다음과 같다.

항목의미
Target Arm Length500로봇과 카메라 사이 거리
Relative Location Z160카메라 기준점을 로봇보다 약간 위로 올림
Pitch-10로봇을 살짝 내려다보는 각도
Do Collision TestfalsePreview 테스트 중 카메라가 바닥이나 로봇 부품에 의해 갑자기 당겨지는 것을 방지

처음에는 이 값을 기준으로 두고, 로봇이 너무 크게 보이면 Target Arm Length를 늘리고, 너무 작게 보이면 줄이면 된다.

가까운 시점 = Target Arm Length 감소
먼 시점 = Target Arm Length 증가

Camera 추가#

CameraBoom을 선택한 상태에서 Camera Component를 추가해주자

CameraBoom 선택 → Add Component → Camera 컴포넌트→ 이름: FollowCamera

이때 FollowCamera는 반드시 CameraBoom의 자식으로 들어가야 한다.

그래야 Spring Arm 끝에 카메라가 붙어서 로봇 뒤쪽 시점을 만들 수 있다.

FollowCamera의 기본값은 다음과 같이 설정해주자

Field Of View = 85
Auto Activate = true

Field Of View는 화면에 보이는 범위를 의미한다.

값이 작으면 망원처럼 좁게 보이고, 값이 크면 게임 카메라처럼 넓게 보인다. Preview 단계에서는 로봇 전체 움직임을 보기 위해 80 ~ 90 정도가 적당하다.


입력과 카메라 역할 분리#

현재 IA_Look은 마우스 X/Y 입력을 받아 AimYaw, AimPitch 값을 갱신하도록 구성했다.

이 값은 이후 Top_M 본을 회전시켜 상부 몸체의 자연스러운 회전 범위를 확인하는 데 사용할 예정이다.

따라서 이번 단계에서는 마우스 입력으로 카메라를 회전시키지 않고, 카메라는 고정된 후방 3인칭 시점으로 둔다.

역할을 정리하면 다음과 같다.

입력 또는 구성역할
CameraBoom + FollowCamera로봇을 뒤쪽에서 보는 Preview 카메라
IA_LookTop_M 상부 몸체 회전 테스트용 입력
IA_MoveBlend Space 이동 입력
IA_LandingLanding / Jump 계열 입력 테스트

이렇게 분리하면 카메라 조작과 상부 몸체 회전 테스트가 서로 섞이지 않는다.


카메라 테스트 기준#

Preview 카메라를 추가한 뒤 Play를 눌러 다음 항목을 확인해보자

확인 항목기준
시작 시점로봇 뒤쪽에서 시작되는가
로봇 크기화면에 로봇 전체가 적당히 들어오는가
다리 확인전후좌우 이동 시 다리 움직임이 보이는가
상부 몸체 확인Top_M 주변 상부 차체가 잘 보이는가
입력 충돌마우스 입력이 카메라 회전과 섞이지 않는가

레벨 분리 구조#

기존 학습용 레벨과 애니메이션 Preview 전용 레벨의 역할은 다음과 같이 나눈다.

flowchart TD
    TestArena[TestArena<br/>학습용 레벨] --> Robot[BP_SpiderRobot]
    TestArena --> Manager[BP_SpiderTrainingManager]
    Manager --> LA[Learning Agents 학습 루프]

    PreviewLevel[L_SpiderAnimPreview<br/>애니메이션 확인용 레벨] --> PreviewPawn[BP_SpiderAnimPreviewPawn]
    PreviewPawn --> Input[WASD / Mouse / Space 입력]
    PreviewPawn --> AnimBP[ABP_SpiderPreview]
    AnimBP --> Blend[BS_SpiderMove]

이렇게 레벨을 분리하면 학습 구조와 애니메이션 확인 구조가 섞이지 않는다.

따라서 WASD 입력, Blend Space 전환, Top_M 회전 테스트를 독립적으로 확인할 수 있다.


테스트 기준#

새 레벨에서 Play를 눌렀을 때 확인할 항목은 다음과 같다.

입력기대 결과
입력 없음Idle 애니메이션
W전진 애니메이션
S후진 애니메이션
A좌측 이동 애니메이션
D우측 이동 애니메이션
W + D전진 + 우측 이동 블렌딩
W + A전진 + 좌측 이동 블렌딩
SpacebLandingPressed가 짧게 true가 됐다가 false로 복귀
Be Your Own Lamp