플레이어 컨트롤러, 폰 블루프린트
지난 절에서 GameMode, GameState, PlayerState로 게임 규칙과 전역 상태를 정리했다면, 이제 플레이어 조작 흐름으로 들어가야 합니다.
이번 절의 중심은 플레이어 컨트롤러(Player Controller)와 폰(Pawn) 블루프린트입니다. 입력이 어디서 받아들여지고, 어떤 경로로 캐릭터 움직임으로 이어지는지 이해하면 게임플레이 구조를 훨씬 명확하게 설계할 수 있습니다.
플레이어 컨트롤러 (Player Controller)
플레이어 컨트롤러 (Player Controller)는 플레이어 입력(마우스, 키보드, 게임패드 등)을 받아 폰(Pawn)을 제어하고, UI/카메라 같은 플레이어 전용 기능을 담당하는 클래스입니다.
각 플레이어는 자신만의 플레이어 컨트롤러를 가지며, 멀티플레이어에서는 클라이언트 입력을 서버로 전달하고 서버 상태를 다시 반영하는 통신 관문 역할도 수행합니다.
주요 역할- 입력 처리: 마우스 클릭, 키보드 입력, 게임패드 입력 등 플레이어의 모든 입력을 받아 처리합니다.
- 폰(Pawn) 제어: 플레이어가 빙의(Possess)할 폰을 선택하고, 해당 폰에게 이동, 공격 등의 명령을 내립니다. 플레이어가 사망하여 새로운 폰으로 재스폰될 때도 플레이어 컨트롤러는 유지됩니다.
- 카메라 제어: 플레이어 시점의 카메라(Camera)를 제어하고 관리합니다.
- UI 상호작용: UI 위젯을 화면에 띄우고, 마우스 커서를 표시하거나 숨기며, UI와의 상호작용(버튼 클릭 등)을 처리합니다.
- 네트워크 통신 (멀티플레이어): 플레이어의 입력을 서버로 전송하고, 서버의 게임 상태 업데이트를 받아 클라이언트에 반영합니다.
- HUD 관리: 플레이어에게 정보를 표시하는 HUD(Heads-Up Display)를 생성하고 관리합니다. (다음 절에서 다룸)
새 블루프린트 클래스 생성: 콘텐츠 브라우저에서 마우스 오른쪽 버튼 클릭 > 블루프린트 클래스(Blueprint Class) > PlayerController를 부모 클래스로 선택합니다.
- 이름을 지정합니다. (예:
PC_MyPlayer)
게임 모드에 플레이어 컨트롤러 연결:
- 여러분의 게임 모드 블루프린트(
GM_MyGame)를 엽니다. 클래스 디폴트(Class Defaults)를 클릭하고디테일(Details)패널에서클래스(Classes)섹션을 찾습니다.Player Controller Class드롭다운에서PC_MyPlayer를 선택합니다.
PC_MyPlayer 블루프린트를 열고 이벤트 그래프에서 입력을 처리할 수 있습니다.
Input Action또는Input Axis이벤트를 생성하고 여기에 로직을 연결합니다. 예를 들어,Input Action Jump이벤트가 발생하면, 현재 플레이어가 빙의(Possess)하고 있는 폰을 가져와Jump함수를 호출하는 식입니다.Get Player Pawn노드를 사용하여 현재 컨트롤하는 폰의 참조를 얻을 수 있습니다.
폰 (Pawn)과 캐릭터 (Character) 블루프린트
폰 (Pawn)은 게임 월드 내에서 '물리적인 존재'로서 움직이고 시각적으로 표현되는 모든 것을 나타내는 기본 클래스입니다. 폰은 AI 컨트롤러나 플레이어 컨트롤러에 의해 빙의(Possess) 될 수 있습니다. 폰 자체는 입력 처리에 대한 로직을 가지지 않으며, 컨트롤러로부터 명령을 받아 행동합니다.
폰의 역할- 월드 내 존재: 게임 월드 내에 시각적, 물리적으로 존재합니다. (메시, 콜리전 등)
- 이동 및 상호작용: 컨트롤러로부터 명령을 받아 이동하고, 다른 오브젝트와 상호작용합니다.
- 빙의 가능: 플레이어 또는 AI에 의해 제어될 수 있습니다.
캐릭터 (Character): 캐릭터 (Character)는 언리얼 엔진에서 가장 많이 쓰이는 폰의 특수화 하위 클래스입니다.
사람이나 동물처럼 이족 보행 캐릭터에 최적화되어 있고, 걷기, 달리기, 점프, 낙하를 처리하는 CharacterMovementComponent를 기본으로 포함합니다. 그래서 대부분의 플레이어 캐릭터와 AI NPC가 Character를 부모 클래스로 사용합니다.
CharacterMovementComponent: 걷기, 달리기, 점프, 낙하 등 복잡한 이동 로직과 네트워크 복제를 자동으로 처리합니다.- 스켈레탈 메시: 애니메이션을 재생할 수 있는 스켈레탈 메시 컴포넌트를 기본으로 포함합니다.
- 캡슐 콜리전: 캐릭터의 몸통을 감싸는 캡슐 형태의 콜리전을 기본으로 제공합니다.
새 블루프린트 클래스 생성: 콘텐츠 브라우저에서 마우스 오른쪽 버튼 클릭 > 블루프린트 클래스(Blueprint Class) > Pawn 또는 Character를 부모 클래스로 선택합니다.
Pawn: 비행체, 자동차, 고정된 카메라 등CharacterMovementComponent의 복잡한 이동 로직이 필요 없는 경우에 사용합니다.Character: 사람 형태의 플레이어 캐릭터나 AI NPC에 가장 적합합니다.- 이름을 지정합니다. (예:
BP_MyPlayerCharacter또는BP_EnemyCharacter)
- 여러분의 게임 모드 블루프린트(
GM_MyGame)를 엽니다. 클래스 디폴트(Class Defaults)를 클릭하고디테일(Details)패널에서클래스(Classes)섹션을 찾습니다.Default Pawn Class드롭다운에서BP_MyPlayerCharacter를 선택합니다.- 참고: AI 캐릭터의 경우, 해당 AI 캐릭터 블루프린트의
디테일패널에서폰(Pawn)섹션의AI Controller Class를 설정합니다. (8장 AI 시스템 구축 참조)
플레이어 컨트롤러와 폰의 상호작용
플레이어 컨트롤러와 폰은 Possess 및 UnPossess 과정을 통해 상호작용합니다.
Possess: 플레이어 컨트롤러가 특정 폰을 빙의하여 제어권을 얻는 과정입니다. 게임 시작 시Default Pawn Class로 지정된 폰이 자동으로 스폰되어 플레이어 컨트롤러에 의해 빙의됩니다. 플레이어가 사망한 후 다른 폰으로 재스폰될 때도 이 과정이 발생합니다.UnPossess: 플레이어 컨트롤러가 현재 제어하던 폰의 제어권을 놓는 과정입니다.
게임 시작: GM_MyGame이 BP_MyPlayerCharacter를 스폰하고, PC_MyPlayer가 이 폰을 Possess합니다.
플레이어 입력: 플레이어가 키보드 입력을 하면, PC_MyPlayer가 이 입력을 받아 BP_MyPlayerCharacter의 CharacterMovementComponent에 이동 명령을 내립니다.
플레이어 사망: BP_MyPlayerCharacter가 파괴되지만, PC_MyPlayer는 계속 존재합니다.
재스폰: GM_MyGame이 새로운 BP_MyPlayerCharacter를 스폰하고, 기존의 PC_MyPlayer가 이 새로운 폰을 다시 Possess합니다. 플레이어의 점수나 스탯을 관리하는 PS_MyPlayer는 이 과정에서도 유지되므로, 재스폰 후에도 점수가 초기화되지 않습니다.
핵심 개념 정리
| 클래스 | 주요 역할 | 특징 |
|---|---|---|
| 플레이어 컨트롤러 (Player Controller) | 입력 처리, 폰 제어, 카메라/UI 관리 | 각 플레이어당 하나, 서버와 클라이언트에 모두 존재 (RPC 호출), 재스폰 시 유지 |
| 폰 (Pawn) | 게임 월드 내 물리적 존재, 이동 및 상호작용 | 컨트롤러에 의해 빙의될 수 있음, 입력 처리 로직 없음, 재스폰 시 새로 생성 |
| 캐릭터 (Character) | 폰의 하위 클래스, 이족 보행에 최적화, CharacterMovementComponent 내장 | 폰과 동일한 특징, 복잡한 이동 로직 지원 |
이처럼 언리얼 엔진의 게임플레이 프레임워크는 각 클래스에 명확한 역할을 부여하여, 게임 로직을 체계적으로 분리하고 관리할 수 있도록 돕습니다. 이는 특히 멀티플레이어 환경에서 네트워크 복제 및 동기화를 효율적으로 처리하는 데 필수적입니다.
이번 절에서는 플레이어의 입력과 캐릭터의 움직임을 담당하는 플레이어 컨트롤러와 폰/캐릭터 블루프린트의 역할과 기본적인 설정 방법에 대해 알아보았습니다. 이들은 플레이어와 게임 세계 간의 직접적인 상호작용을 구현하는 데 핵심적인 요소입니다.