
플레이어 컨트롤러는 입력을 받아서 Player Class에서 전달만 하고, 결과는 Player Class에서 처리한다.
플레이어 컨트롤러의 역할
- 입력 처리 - Enhanced Input System
- 카메라 제어 로직
- UI와의 상호작용
- 드래그 앤 드롭 또는 버튼 누르기 등
- Possess/ UnPossess
플레이어 컨트롤러 만들기

PlayerController를 만든다.

이제 블루프린트로 래핑을 한번 해준다.


게임모드에서 바꾸면 프로젝트 세팅에서도 자동으로 연동되어 적용된다.

Enhanced Input System
원래 인풋 시스템이 있었는데, 향상된 인풋 시스템이 새로 나오면서 대체되었다.
- Input Mapping System(IMC)
- IA를 관리하는 시스템
- Input Action(IA)
- 어떤 동작을 추상화한 것.
- 점프 -> IA_Jump
- 마우스 회전-> IA_Look
- 이동 -> IA_Move
- 어떤 동작을 추상화한 것.
캐릭터 행동
- 이동 WASD
- 마우스 회전
- 점프
- 스프린트

- Value Type
- 입력 동작이 발생했을 때, 어떤 유형의 값을 변환시킬 것인가를 결정
- Digital(bool)은 단순 입력 여부 판단
- Axis1D(float)는 단일 축(자동차 등에서 사용)
- Axis2D(Vector2D)는 X, Y 두 축을 동시에 처리
- Axis3D(Vector)는 X, Y, Z 세 축을 동시에 처리(비행 시뮬레이터 등에 사용)
- 입력 동작이 발생했을 때, 어떤 유형의 값을 변환시킬 것인가를 결정
- Triggers
- 동작이 수행되는 조건. 일반적인 Move 입력 정도는 따로 지정해줄 필요가 없다.
- Pressed: 누를 때
- Released: 키를 뗄 때
- Hold: 오랜 시간 누르고 있을 때
- Combo: 여러 번 누를 때
- 동작이 수행되는 조건. 일반적인 Move 입력 정도는 따로 지정해줄 필요가 없다.
- Modifiers
- DeadZone: 미세한 입력을 조정.
- Negate: 입력 값 반전
- Scalar: 입력값 크기 배율 확대
- Swizzle Input Axis Values: 입력값에 축을 재구성해준다.

IA_Move는 Value Type에 Axis2D(Vector2D) 정도만 지정하고 나머지는 비워둔다.








전진이 X축을 기준으로 1을 움직히는 것이기 때문에 X를 앞으로 해줘야한다. 이전 블루프린트 수업 때는 Swizzel Input Axis Values를 따로 정해주지 않았는데, 이번 강의에서는 전부 따로 설정해준다.





PlayerController.h를 수정한다.
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/PlayerController.h"
#include "SpartaPlayerController.generated.h"
class UInputMappingContext;
class UInputAction;
/**
*
*/
UCLASS()
class SPARTAPROJECT_API ASpartaPlayerController : public APlayerController
{
GENERATED_BODY()
public:
ASpartaPlayerController();
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="input")
UInputMappingContext* InputMappingContext;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "input")
UInputAction* MoveAction;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "input")
UInputAction* JumpAction;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "input")
UInputAction* LookAction;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "input")
UInputAction* SprintAction;
};
// Fill out your copyright notice in the Description page of Project Settings.
#include "SpartaPlayerController.h"
#include "EnhancedInputSubsystems.h"
ASpartaPlayerController::ASpartaPlayerController():
InputMappingContext(nullptr), // 아무것도 할당하지 않는 것보다는 nullptr을 할당해주는 것이 좋다.
MoveAction(nullptr),
JumpAction(nullptr),
LookAction(nullptr),
SprintAction(nullptr)
{
}
void ASpartaPlayerController::BeginPlay()
{
Super::BeginPlay();
// 플레이어를 가져오기 -> 향상된 입력 관리하는 서브시스템 획득하기 -> IMC 객체 확인하고 서브시스템에 IMC 추가하며 우선순위를 최우선으로 두고 활성화시키기
if (ULocalPlayer* LocalPlayer = GetLocalPlayer()) // GetLocalPlayer는 플레이어의 로컬 객체를 가져옴
{
if (UEnhancedInputLocalPlayerSubsystem* Subsystem = LocalPlayer->GetSubsystem<UEnhancedInputLocalPlayerSubsystem>()) // 입력 시스템을 관리하는 서브시스템. IMC를 추가하거나 삭제하는 역할을 한다.
{
if (InputMappingContext) // 인풋 매핑 컨텍스트가 존재하면
{
Subsystem->AddMappingContext(InputMappingContext, 0); // InputMappingContext로 활성화함. 0은 우선순위를 뜻함.
}
}
}
}
Player Controller 블루프린트에 들어가서 Input을 하나하나 할당해준다.



Play하여 잘 나오는지 확인한다.

'게임 개발 > 학습 일지' 카테고리의 다른 글
| 언리얼 엔진 심화 2주차 - 컨테이너와 포인터 (0) | 2026.04.19 |
|---|---|
| 언리얼 게임 개발 - 차량 에셋에 바퀴 굴러가는 애니메이션 추가하기 (0) | 2026.04.17 |
| 언리얼 C++ - Character 클래스를 이용한 캐릭터 구현하기 (0) | 2026.04.15 |
| TA 코스 2주차 과제 - 마법 구체 만들기 (0) | 2026.04.15 |
| 언리얼 내배캠 과제 6번- 회전 발판과 움직이는 장애물 (0) | 2026.04.14 |