Unreal

Player Controller

(ꐦ •᷄ࡇ•᷅) 2025. 2. 12. 18:42

1. PlayerController란?

  • PlayerController는 사용자가 키보드, 마우스, 게임 패드 등에서 입력을 받으면, 그 입력을 해석하여 캐릭터나 다른 오브젝트에게 동작을 명령하는 핵심 클래스이다.
  • 특히 멀티플레이 환경에서는, 각 플레이어마다 개별 PlayerController가 생성되므로, 여러 사용자의 입력을 충돌 없이 분리하고 관리할 수 있다.
언리얼 엔진의 중요한 철학 중 하나는 "플레이어 입력은 PlayerController에서 처리한다."이다.

이를 통해 입력 처리 로직과 실제 캐릭터의 동작 로직을 분리할 수 있어, 코드를 구조적으로 관리하기가 훨씬 수월해진다.

 

1-1. 입력이 처리되는 기본 흐름

  1. 키보드, 마우스, 게임 패드 등 입력 장치로부터 사용자 조작 신호가 들어온다.
  2. 이 신호는 PlayerController가 받아서 해석한다.
  3. PlayerController가 현재 소유(Possess)하고 있는 Pawn에게 이동, 회전, 공격 등의 구체적인 명령을 내린다.

2. PlayerController의 주요 기능

입력 처리

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

 

카메라 제어 로직

  • 마우스나 게임 패드의 축 입력을 받아 캐릭터의 시점 회전이나 줌 인/아웃 같은 카메라 동작을 수행할 수 있다.

 

HUD 및 UI와의 상호작용

  • 언리얼의 UMG(언리얼 모션 그래픽) 기반 UI를 통해 버튼 클릭, 드래그, 터치 등의 이벤트를 PlayerController에서 받을 수 있다.
  • 예를 들어 인벤토리 열기, 스킬 사용 등의 명령을 UI에서 트리거하면 PlayerController가 이를 해석해 Pawn 또는 GameMode 등 다른 시스템으로 전달할 수 있다.

 

Possess / UnPossess

  • PlayerController는 특정 Pawn에 빙의하여 해당 Pawn을 제어한다.
  • 필요할 때 UnPossess() 함수를 호출하여 Pawn과의 연결을 해제한 뒤, 다른 Pawn으로 바꿔 탈 수도 있다.
  • 멀티 플레이 시 각 플레이어마다 고유의 PlayerController가 있고, 이 컨트롤러가 특정 Pawn을 소유함으로써 서로 다른 캐릭터 조작이 가능하다. 

3. PlayerController 생성해 보기

Tools > New C++ Class > PlayerController 클래스를 선택해 생성하면 된다.

 


4. PlayerController를 GameMode에 적용하기

  • PlayerController가 게임에서 실제로 사용되려면, GameMode에 등록해야 한다.
  • GameMode는 "어떤 PlayerController, 어떤 Pawn을 사용할 것인가?"를 결정하는 역할을 담당하므로, GameMode 클래스의 코드를 수정한다.

코드 설명

  • PlayerControllerClass는 GameMode가 제공하는 속성으로, 게임 시작 시 사용할 PlayerController 타입을 지정한다. 
  • APawnPlayerController::StaticClass()는 언리얼 엔진이 APawnPlayerController 클래스의 정보를 런타임에 참조할 수 있도록 제공하는 정적 함수이다.
  • 위 코드를 저장 후 프로젝트 빌드를 완료하면, 언리얼 에디터에서 GameMode가 PawnPlayerController를 기본 PlayerController로 인식하게 된다.
  • 이 클래스를 더 손쉽게 편집할 수 있도록 블루프린트로 래핑하는 과정을 거칠 수 있다. 

 


5. PlayerController 동작 확인

GameMode에서 PlayerController 클래스를 적용한 뒤, Play 버튼을 눌러 게임을 실행한다.

 

이렇게 GameMode에 PlayerController클래스를 지정하면, 게임 시작 시 해당 PlayerController가 자동으로 스폰되어 플레이어 입력을 처리한다.