플레이어 컨트롤러, 폰 블루프린트
PlayerController와 Pawn·Character의 책임을 구분하고 입력·빙의·이동·카메라가 이어지는 흐름을 이해합니다.
지난 절에서 GameMode, GameState, PlayerState로 게임 규칙과 전역 상태를 정리했다면, 이제 플레이어 조작 흐름으로 들어가야 합니다.
이번 절의 중심은 플레이어 컨트롤러(Player Controller)와 폰(Pawn) 블루프린트입니다.
입력이 어디서 받아들여지고, 어떤 경로로 캐릭터 움직임으로 이어지는지 이해하면 게임플레이 구조를 훨씬 명확하게 설계할 수 있습니다.
플레이어 조작 흐름은 입력을 받는 Player Controller, 월드에서 움직이는 Pawn, 빙의 시점을 정하는 GameMode 책임을 분리해 읽어야 안정적입니다.
- 플레이어 컨트롤러 흐름
키보드·패드 입력이 로컬 플레이어의 액션 값으로 변환됩니다. 2 입력 의도를 해석하고 카메라·UI처럼 플레이어별 결정을 보관합니다. 3 서버 권한에서 Controller가 조종할 Pawn을 연결하거나 해제합니다. 4 이동·충돌·애니메이션을 실행하고 결과를 월드 상태로 나타냅니다.
- Local Input
키보드·패드 입력이 로컬 플레이어의 액션 값으로 변환됩니다.
- Player Controller
입력 의도를 해석하고 카메라·UI처럼 플레이어별 결정을 보관합니다.
- Possess / UnPossess
서버 권한에서 Controller가 조종할 Pawn을 연결하거나 해제합니다.
- Pawn / Character
동·충돌·애니메이션을 실행하고 결과를 월드 상태로 나타냅니다.
- 플레이어 컨트롤러 판단 기준
입력 매핑, 카메라 전환, UI 호출처럼 플레이어별로 달라지는 결정을 Controller 쪽에 둡니다. 이동 컴포넌트, 충돌 캡슐, 애니메이션 메시처럼 월드에 놓이는 몸체 상태를 Pawn 쪽에서 검증합니다. Possess와 UnPossess가 실행되는 시점, 서버 권한, PlayerState 참조가 서로 어긋나지 않는지 확인합니다.
플레이어 컨트롤러 (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가 두 객체를 연결하며, Pawn이 바뀌어도 PlayerController의 입력 주체는 유지된다.
- GameMode
접속 시 PlayerController와 첫 Pawn을 준비한다.
- PlayerController
플레이어 입력과 화면·UI 관점을 소유한다.
- Possess
Controller가 현재 조종할 Pawn을 명시적으로 연결한다.
- Pawn
동, 충돌, 애니메이션처럼 월드 행동을 실행한다.
- Respawn
새 Pawn을 만든 뒤 같은 Controller가 다시 Possess한다.
- 입력이 안 들어옴
Controller의 GetPawn과 Possess 여부를 확인한다.
- 사망 후 조작 불가
새 Pawn 생성 뒤 Possess 호출 누락을 찾는다.
- 경계 기준
입력 해석은 Controller, 월드 동작은 Pawn에 둔다.
플레이어 컨트롤러와 폰은 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는 이 과정에서도 유지되므로, 재스폰 후에도 점수가 초기화되지 않습니다.
플레이어 컨트롤러는 입력과 화면 관문으로 유지되고, 실제 월드 몸체인 폰은 파괴 후 새로 빙의됩니다. 점수처럼 플레이어 기록은 PlayerState 쪽에 두면 교체 과정에서 사라지지 않습니다.
- 사망 직전
PC가 현재 Pawn을 조작하고, CharacterMovementComponent가 이동을 처리합니다. 유지 PlayerController, PlayerState 교체 후보 체력 0이 된 Pawn
- UnPossess와 제거
컨트롤러는 제어권을 놓고, 사망한 폰은 파괴되거나 비활성 상태로 전환됩니다. 입력 잠시 차단하거나 UI 전용으로 전환 기록 점수와 팀 정보는 PlayerState에 보존
- 새 Pawn 스폰
GameMode가 Default Pawn Class 또는 재스폰 규칙에 맞춰 새 캐릭터를 만듭니다. 위치 시작 지점, 체크포인트, 팀 스폰 중 선택 상태 체력과 이동 컴포넌트는 새 기본값
- 다시 Possess
기존 PlayerController가 새 Pawn을 빙의하고 입력, 카메라, UI 연결을 복구합니다. 복구 입력 모드, 카메라 타깃, HUD 참조 참조 확인 Get Player Pawn이 새 Pawn을 가리키는지 점검
- Pawn에 두면 함께 사라지는 정보
현재 체력, 애니메이션 상태, 임시 버프처럼 몸체에 묶인 값은 새 Pawn 생성 때 다시 초기화합니다.
- PC와 PlayerState에 남길 정보
입력 권한, UI 상태, 점수, 팀, 플레이어 이름처럼 플레이어 자체에 속한 값은 재스폰과 분리합니다.
핵심 개념 정리
| 클래스 | 주요 역할 | 특징 |
|---|---|---|
| 플레이어 컨트롤러 (Player Controller) | 입력 처리, 폰 제어, 카메라/UI 관리 | 각 플레이어당 하나, 서버와 클라이언트에 모두 존재 (RPC 호출), 재스폰 시 유지 |
| 폰 (Pawn) | 게임 월드 내 물리적 존재, 이동 및 상호작용 | 컨트롤러에 의해 빙의될 수 있음, 입력 처리 로직 없음, 재스폰 시 새로 생성 |
| 캐릭터 (Character) | 폰의 하위 클래스, 이족 보행에 최적화, CharacterMovementComponent 내장 | 폰과 동일한 특징, 복잡한 이동 로직 지원 |
이처럼 언리얼 엔진의 게임플레이 프레임워크는 각 클래스에 명확한 역할을 부여하여, 게임 로직을 체계적으로 분리하고 관리할 수 있도록 돕습니다.
이는 특히 멀티플레이어 환경에서 네트워크 복제 및 동기화를 효율적으로 처리하는 데 필수적입니다.
이번 절에서는 플레이어의 입력과 캐릭터의 움직임을 담당하는 플레이어 컨트롤러와 폰/캐릭터 블루프린트의 역할과 기본적인 설정 방법에 대해 알아보았습니다.
이들은 플레이어와 게임 세계 간의 직접적인 상호작용을 구현하는 데 핵심적인 요소입니다.
플레이어 조작 구조는 입력을 받는 컨트롤러와 월드에서 움직이는 폰의 책임을 분리해서 봐야 합니다.
PlayerController는 플레이어 전용 입력과 UI, 카메라를 담당하고 Pawn 또는 Character는 실제 월드 이동과 충돌을 담당합니다.
- Input Action
입력 키보드, 마우스, 패드 입력이 플레이어 컨트롤러로 들어옵니다.
- Controller 판단
명령 현재 빙의한 Pawn을 찾고 이동, 공격, UI 명령으로 나눕니다.
- Possess 연결
빙의 컨트롤러가 Pawn의 제어권을 갖고 입력 명령을 전달합니다.
- Movement 실행
동작 CharacterMovementComponent나 Pawn 로직이 실제 위치를 갱신합니다.
- PlayerController와 Pawn 구분
입력, 카메라, HUD, 클라이언트 전용 상호작용의 기준점입니다. 월드 안에서 빙의 가능한 물리적 존재이며 입력 처리 자체는 갖지 않아도 됩니다. 보행 캐릭터용 Pawn으로 캡슐, 메시, MovementComponent가 기본입니다.
- PlayerController
입력, 카메라, HUD, 클라이언트 전용 상호작용의 기준점입니다.
- Pawn
월드 안에서 빙의 가능한 물리적 존재이며 입력 처리 자체는 갖지 않아도 됩니다.
- Character
보행 캐릭터용 Pawn으로 캡슐, 메시, MovementComponent가 기본입니다.
재스폰과 UI, 카메라까지 포함하면 플레이어 컨트롤러는 지속되는 의도, 폰은 교체 가능한 월드 존재라는 기준으로 설계하는 편이 안전합니다.
플레이어 컨트롤러는 입력, UI, 카메라처럼 지속되는 의도를 맡고 폰은 월드에서 움직이는 교체 가능한 대상을 맡습니다.
- 조작 단서조작 단서 PlayerController Pawn
Possess
- 지속 객체
PlayerController는 재스폰 후에도 유지되어 입력 매핑, HUD, 카메라 흐름을 관리합니다.
- 교체 대상
Pawn이나 Character는 월드 위치, 이동, 충돌을 담당하고 사망 후 새로 생성될 수 있습니다.
- 빙의 연결
Possess는 컨트롤러의 의도를 특정 폰에 연결하고 UnPossess는 그 연결을 끊습니다.
- input
입력 처리가 컨트롤러와 폰 중 어디에 있는지 확인합니다.
- spawn
GameMode가 어떤 Pawn을 만들지 설정합니다.
- possess
빙의 시점과 실패 처리를 점검합니다.
- respawn
재스폰 후 유지할 값이 PlayerState나 Controller에 있는지 봅니다.
마지막으로 PlayerController와 Pawn을 나눌 때 입력, 소유, 월드 행동의 책임 기준을 정리합니다.
PlayerController는 입력과 로컬 UI의 중심이고 Pawn이나 Character는 월드 안에서 실제 이동과 액션을 수행합니다.
- 입력 소유자와 몸체를 분리
컨트롤러는 어떤 Pawn을 조종하는지 알고, Pawn은 이동 컴포넌트와 액션 로직으로 월드 반응을 처리합니다. 01 Input Action, 카메라 모드, HUD 생성, 메뉴 입력처럼 로컬 플레이어와 가까운 처리를 담당합니다. 02 Add Movement Input, 점프, 피격, 상호작용 범위처럼 월드 물리와 충돌을 실제로 실행합니다. 03 리스폰이나 차량 탑승처럼 Pawn이 바뀌면 Possess 이후 입력 대상, 카메라, UI 참조를 다시 맞춥니다.
- 입력 소유자와 몸체를 분리
컨트롤러는 어떤 Pawn을 조종하는지 알고, Pawn은 이동 컴포넌트와 액션 로직으로 월드 반응을 처리합니다.
- Controller 역할
Input Action, 카메라 모드, HUD 생성, 메뉴 입력처럼 로컬 플레이어와 가까운 처리를 담당합니다.
- Pawn 역할
Add Movement Input, 점프, 피격, 상호작용 범위처럼 월드 물리와 충돌을 실제로 실행합니다.
- Possess 전환
리스폰이나 차량 탑승처럼 Pawn이 바뀌면 Possess 이후 입력 대상, 카메라, UI 참조를 다시 맞춥니다.