나만의 작은 도서관

[TIL][C++] 250903 MMO 서버 개발 93일차: [언리얼] 플레이어 컨트롤러 복습 본문

Today I Learn

[TIL][C++] 250903 MMO 서버 개발 93일차: [언리얼] 플레이어 컨트롤러 복습

pledge24 2025. 9. 4. 02:31
주의사항: 해당 글은 일기와 같은 기록용으로, 다듬지 않은 날것 그대로인 글입니다. 

[언리얼] 플레이어 컨트롤러 복습

 

PlayerController란?

  • PlayerController(줄여서 PC)는 플레이어가 키보드, 마우스 등 입력 장치를 통해 입력을 했을 때, 그 입력을 해석하여 동작을 수행하는 핵심 클래스이다.

 

핵심 내용: 플레이어는 PC를 통해 Pawn을 제어한다.

  • Pawn 또는 Pawn을 상속받는 클래스의 객체를 플레이어가 제어하고 싶다면 PC를 해당 객체에 빙의시키는 방식으로 진행된다.
  • 예를 들어, Pawn을 상속받는 클래스인 Character를 키보드 키 ‘w’ 입력을 통해 앞으로 이동시키고 싶다면, 1) 해당 Character는 PC에 빙의되어 있어야 하며, 2) PC에 w 입력과 매핑된 액션과 바인딩된 함수가 있어야 한다. 또한 해당 함수에서 Character를 이동시키는, 예를 들어 Move와 같은 함수를 호출해야 한다.

 

언리얼 엔진의 중요한 철학 중 하나: “플레이어의 입력은 PC에서 처리한다”

  • 입력이 들어왔을 때 이를 해석하고 입력에 따른 행동을 바인딩하는 로직을 PC에 두면 실제 캐릭터의 동작 로직을 입력 처리 로직과 분리할 수 있어, 코드를 구조적으로 관리하기 훨씬 수월해진다.

 

예시. 마우스 왼쪽 버튼 클릭 시, 내 캐릭터가 공격 모션을 취한다.

  • 마우스 왼쪽 버튼 클릭이 공격이다 → 액션 바인딩에서 미리 정함(마우스 왼쪽 클릭과 “Attack”이라는 액션을 매핑)
  • Attack이라는 액션 발생 시 내 캐릭터가 이에 반응하도록 한다. → PC
    • PC는 BindAction함수를 통해 액션 “Attack”과 Character→OnAttack() 함수를 바인딩한다.
  • 내 캐릭터가 공격 모션을 취한다. → 따로 정의한 Character 클래스
    • OnAttack 함수를 정의하고, 함수 내부에 공격 모션을 취하는 코드를 작성한다. 델리게이트 방식이라면, 브로드캐스트(또는 Execute)를 호출한다.

 

PC에선 Pawn의 제어와 관련된 내용만 작성되는가? - 아니다.

  • PC가 빙의한 Pawn을 제어하는 역할이 가장 큰 역할이지만, 사용자의 입력 자체를 처리하기 때문에 더 많은 역할을 맡는다. PC가 담당하는 역할들을 나열하자면 아래와 같다.

 

PC의 역할 1. 입력처리

  • 키보드, 마우스, 게임 패드, 터치 등 다양한 입력 장치의 이벤트를 처리한다.
  • UE5에서 제공하는 Enhanced Input 시스템을 사용하면 , 액션/축 매핑을 보다 체계적으로 설정할 수 있다.
  • C++에서 SetupInputComponent() 함수를 오버라이드하여 입력 로직을 구현할 수 있다.

 

SetupInputComponent() 오버라이드?

  • 오버라이드를 하는 이유는 해당 클래스(주로 PC나 Pawn, Character)가 입력을 어떻게 처리할지를 직접 정의하기 위해서이다. 예를 들면 아래와 같다.
void AMyCharacter::SetupInputComponent()
{
		// 상위 클래스에서 등록해두었던 입력 바인딩도 사용
    Super::SetupInputComponent();

    // 키 입력에 함수 바인딩
    InputComponent->BindAction("Jump", IE_Pressed, this, &AMyCharacter::Jump);
    InputComponent->BindAction("Jump", IE_Released, this, &AMyCharacter::StopJumping);

    // 축 입력(연속 입력)에 함수 바인딩
    InputComponent->BindAxis("MoveForward", this, &AMyCharacter::MoveForward);
    InputComponent->BindAxis("MoveRight", this, &AMyCharacter::MoveRight);
    InputComponent->BindAxis("Turn", this, &AMyCharacter::AddControllerYawInput);
    InputComponent->BindAxis("LookUp", this, &AMyCharacter::AddControllerPitchInput);

    // 추가 행동들
    InputComponent->BindAction("Attack", IE_Pressed, this, &AMyCharacter::Attack);
    InputComponent->BindAction("ToggleInventory", IE_Pressed, this, &AMyCharacter::ToggleInventory);
}

  • 위 코드처럼 SetupInputComponent는 BindAction, BindAxis와 같은 바인딩 함수들이 여러 개 들어가 있는 모습을 한다.
  • 즉, SetupInputComponent는 현재 클래스가 처리한 입력에 대한 모든 바인딩을 모아서 등록하고 있는 것.
  • 빙의하는 시점에 엔진이 SetupInputComponent를 자동으로 호출하기 때문에 생성자나 BeginPlay에서 직접 입력을 바인딩하지 않아도 된다는 편리함이 있다.

 

PC의 역할 2. 위젯 간 상호작용

  • 언리얼의 UMG(Unreal Motion Graphic) 기반 위젯들을 통해 버튼 클릭, 드래그, 터치 등의 이벤트를 PC에서 받을 수 있다.
  • 예로, T 키 입력 시 상태창 열림, 1번 키 입력시 물약 사용등이 있다.

 

결론

  • PC는 플레이어의 모든 입력에 대해 관리하며, 현재 빙의 중인 Pawn 또는 Pawn을 상속받는 객체의 제어를 위한 입력 처리의 해석 부분과 위젯과의 상호작용 로직이 들어가 있다.