오늘은 플레이어의 움직임을 블루프린트로 구현해보겠습니다.
플레이어 생성 및 입력 처리
플레이어가 움직이기 위해서는 단순히 위치를 이동시키는 것뿐만 아니라,
컨트롤러(Controller), 입력 처리(Input), 그리고 Movement Component와 같은 요소들이 함께 필요합니다.
먼저 기본적인 구조를 이해하기 위해 Pawn을 생성하여 간단한 이동을 구현해보고,
이후 보다 확장된 기능을 제공하는 Character 클래스를 활용하여 움직임을 제어해보겠습니다.
우선 플레이어의 움직임을 구현하기 위해서는 입력 처리 과정이 필요합니다.
이를 위해 먼저 Input Action과 Input Mapping Context를 생성해보겠습니다.

위에서 생성한 Input Action은 어떤 입력 값을 받아올지 정의하는 Data Asset으로, 이번 예제에서는 키보드 입력(WASD)을 처리하기 위해 Value Type을 Axis 2D(Vector2D)로 설정하였습니다.
이를 통해 W,A,S,D 입력을 각각 하나의 벡터 값으로 받아와, 플레이어의 이동 방향을 보다 직관적으로 제어할 수 있도록 구성했습니다.

위에서 생성한 IMC_Game은 Input Mapping Context로, 앞서 선언한 IA_Move(Input Action)에 대해 어떤 키 입력이 어떤 축 값(X,Y)으로 들어갈지 정의하는 역할을 합니다.
즉, IMC는 단순히 키를 등록하는 것이 아니라
입력값을 하나의 방향 데이터 (Vector2D)로 변환해주는 관리 역할을 한다고 볼 수 있습니다.
계속해서 살펴보면,
키보드 입력은 기본적으로 0 또는 1의 1차원 값으로 들어오기 때문에 이 단계에서 어떤 값이 X축인지, Y축인지 직접 매핑해주어야 합니다.
이를 위해 Swizzle Input Axis을 사용하여 입력 값을 원하는 축으로 재배치해줍니다.
예를 들어,
W/S 입력을 Y축으로 사용하고 싶다면 Swizzle을 통해 해당 값을 Y축으로 전달하도록 설정합니다.
(Tmi. 입력은 기본적으로 PlayerController에서 처리된 후 Pawn으로 전달되는 구조입니다.
따라서 입력을 Controller에서 직접 처리할 수도 있고, Pawn(또는 Character)에서 처리할 수도 있으며, 프로젝트 구조에 맞게 적절한 위치를 선택하여 구현할 수 있습니다.)

다음으로는, 앞서 설정한 입력을 실제로 받아 움직일 캐릭터를 구현해보겠습니다.
캐릭터가 이동하기 위해서는 Movement Component가 필요하며,
이번 예제에서는 중력의 영향을 받지 않는 FloatingPawnMovement를 추가하여 기본적인 이동을 구현하엿습니다.
(Tmi, 만약 이동처리를 offset을 이용해 한다면 충돌처리가 되지 않는다.)

다음으로는, 앞서 생성한 IMC(Input Mapping Context)과 플레이어를 실제 게임에 적용하기 위해 GameMode Blueprint를 설정해보겠습니다.
GameMode는 해당 월드에서 사용할 기본 클래스(플레어어, 컨트롤러 등)를 결정하는 역할을 합니다.
따라서 월드 설정에서 Game Mode를 BP_GameMode로 지정해주어야 우리가 설정한 입력 시스템과 플레이어 로직이 정상적으로 작동하게 됩니다.
플레이어 애니메이션 동작
이제 플레이어(캐릭터)를 만들고 플레이어 에 애니메이션을 적용하여, 단순한 이동 구현을 넘어 실제 게임과 같은 형태로 확장해보겠습니다.

우선 플레이어에 기본적으로 추가된 Component를 살펴보자
- Capsule Component : 캐릭터의 충돌을 담당하는 컴포넌트
- Arrow Component : 캐릭터의 Forward 방향(전방 방향)을 나타내는 기준
- Character Movement : 플레이어의 이동 및 물리 동작을 처리하는 컴포넌트
이제 플레이어를 화면에 비추기 위해 카메라 설정이 필요합니다.
이를 위해 Add 버튼을 통해 Spring Arm을 추가하고, 해당 Spring Arm 끝에 Camera를 부착하여 플레이어를 따라다니는 카메라를 구성합니다.

다음은 플레이어에 전달된 입력 값을 실제 이동으로 처리하는 Event Graph 입니다.
입력 값은 Vector2D로 전달되기 때문에, 이를 각각 분리하여 앞/뒤 이동(Y축) 과 좌/우 이동(X축)에 사용합니다.
이후 각 축의 값을 Add Movement Input 노드에 전달하여 플레이어가 입력 방향에 맞게 이동하도록 구현합니다.
하지만, 이렇게 구현하면 플레이어는 단순히 이동만 하고 방향은 바뀌지 않는 문제가 발생합니다.
따라서 이번에는 카메라 기준으로 회전까지 함께 적용해보겠습니다.

회전을 적용하기 위해 사용하는 핵심 노드는 Get Control Rotation 입니다.
- Get Control Rotation이란? → 현재 카메라(컨트롤러)가 바라보는 방향(회전값)을 의미합니다.
즉, 언리얼 엔진의 기준 축으로 부터 현재 카메라의 회전량을 의미합니다.
입력값은 보통 다음과 같이 나뉩니다.
- X 입력 (A/D) → 좌/우 이동
- Y 입력 (W/S) → 앞/뒤 이동
이를 처리하기 위해
- X 입력 → 카메라의 Right Vector 사용
- Y 입력 → 카메라의 Yaw 값을 기반으로 Forward Vector 생성
여기서 Get Right Vector/ Get Foward Vector는 해당 주어진 회전값을 기준으로 해당 방향의 벡터를 생성해주는 노드입니다.

Use Pawn Control Rotation을 체크 안하면 카메라가 Control Rotation을 따라가지 않으므로

위와 같은 노드에서 Control Rotation이 따라가지 않게 된다.
따라서 체크한다면
마우스 움직임 → Control Rotation 변경 → Spring Arm 회전 → 끝에 달린 카메라도 자연스럽게 회전
이런 흐름으로 작동하게 된다.
다음은 플레이어 애니메이션에 대해 조금 다뤄보겠습니다.

플레이어의 애니메이션은 보통 AnimInstance에서 관리합니다.
AnimInstance의 Evenet Graph 역할
→ 캐릭터의 상태(속도,점프 여부 등)를 기반으로 어떤 애니메이션을 재생할지 판단하기 위한 값을 업데이트하는 역할
(즉, 애니메이션에 필요한 변수들을 계산하는 곳 )
AnimInstance의 AnimGraph 역할
→ AnimGraph는 Event Graph에서 계산된 값을 기반으로 실제 애니메이션을 조합하고 최종 포즈를 만들어 출력하는 역할을 한다.
(주로, 다음애니메이션과 현재 애니메이션 사이 보간 시간 및 보간 그래프 조절 및 상태 값을 통한 애니메이션 변경 작업을 한다.)
Level Streaming이란?
Level Streaming은 하나의 큰 맵을 여러 개의 Level로 나누고, 필요한 부분만 실시간으로 로드/언로드하는 기능입니다.
Level Streaming은 왜 필요한가?
게임에서 맵이 커지면 커질수록 발새앟는 문제로 다음과 같은 경우들이 있다.
- 한 번에 모든 맵을 로드 -> 메모리 과다 사용
- 로딩시간 증가 -> 끊김 현상 발생
- FPS 저하
이러한 이유로 Unreal에서는 Level Streaming을 사용한다.

다음과 같은 Level Streamming을 만들기 위해서는 3개의 Level이 필요하다
Persistent Level은 전체 맵을 의미하며 그 이후로 SubLevel01, SubLevel02은 각각 나눠진 레벨 구조이다.

Levels 추가하면 다음과 같이 Level 구조를 확인할 수 있는 UI가 생성됩니다.
이후 원하는 Level을 Drag & Drop으로 추가하면 Sub Level 구조를 구성할 수 있습니다.
이번에 구현할 Level Streaming 방식
1. 특정 지점을 기준으로 로딩 (Trigger 방식)
→ 플레이어가 특정 경로를 지나갈 때 SubLevel02를 로딩하는 방식
- Trigger Volume을 이용하여 구현
- 이벤트 기반 (플레이어 진입 시 로드, 즉 특정 조건 만족 시 발동)

해당 방식을 추가하기 위해서는 해당 맵을 클릭후 왼쪽 Place Actor 창에서 Volumes 항목에서 Trigger Volume을 추가하면 된다




해당 방법은 Cpp로는 작성할 수 없고 오직 블루프린트로만 가능한 기능으므로 잊지말고 알고있자.

2. 카메라 위치 기반 로딩 (Level Streaming Volume 방식)
→ 카메라의 위치에 따라 자동으로 SubLevel02를 로딩을 OnOff하는 방식
- Level Streaming Volume 사용
- 영역 기반 자동 로딩 ( = 위치 기반 자동 로딩으로 영역 진입 시 발생 )




(Tmi. 블루프린트로 맵을 로드 할때 잊지 말아야 할 것!)

(Tmi+. 그림자가 이상하게 남겨질때 virtual shadow -> shadow map으로 변경하면 해결!)

'Unreal Project > Blueprint' 카테고리의 다른 글
| Blueprint 공부 일기 7 (Camera Shake, State Alias(점프), UI 이벤트) (0) | 2026.03.23 |
|---|---|
| Blueprint 공부 일기 6 (AI Perception, UI , Billboard , Data Table) (2) | 2026.03.20 |
| Blueprint 공부 일기 5 ( Pawn Sensing 기반 몬스터 탐지 Behavior Tree, Debug 명령어) (0) | 2026.03.19 |
| Blueprint 공부 일기 1 ( 오브젝트 생성 및 충돌 상호작용 ) (1) | 2026.03.13 |