본문 바로가기

플레이어 컨트롤러, 폰 블루프린트

PlayerController와 Pawn·Character의 책임을 구분하고 입력·빙의·이동·카메라가 이어지는 흐름을 이해합니다.

지난 절에서 GameMode, GameState, PlayerState로 게임 규칙과 전역 상태를 정리했다면, 이제 플레이어 조작 흐름으로 들어가야 합니다.

이번 절의 중심은 플레이어 컨트롤러(Player Controller)와 폰(Pawn) 블루프린트입니다.

입력이 어디서 받아들여지고, 어떤 경로로 캐릭터 움직임으로 이어지는지 이해하면 게임플레이 구조를 훨씬 명확하게 설계할 수 있습니다.


플레이어 컨트롤러 (Player Controller)

플레이어 컨트롤러 (Player Controller)는 플레이어 입력(마우스, 키보드, 게임패드 등)을 받아 폰(Pawn)을 제어하고, UI/카메라 같은 플레이어 전용 기능을 담당하는 클래스입니다.

서버는 각 플레이어의 PlayerController를 가지며, 각 클라이언트에는 자신이 소유한 PlayerController가 있습니다. 다른 플레이어의 PlayerController가 모든 클라이언트에 복제되는 구조는 아닙니다.

주요 역할
  • 입력 처리: 마우스 클릭, 키보드 입력, 게임패드 입력 등 입력을 처리할 수 있습니다. 입력 바인딩은 Pawn/Character에도 둘 수 있으므로 책임을 정해 분리합니다.
  • 폰(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 블루프린트를 열고 이벤트 그래프에서 입력을 처리할 수 있습니다.

  • 입력 액션 이벤트에서 Get Controlled Pawn으로 이 컨트롤러가 빙의한 폰을 가져옵니다. 유효성을 확인하고 Character로 캐스트한 뒤 Jump를 호출합니다. 일반 Pawn에는 Jump가 없습니다.
  • Get Player Pawn은 플레이어 인덱스로 조회합니다. 특정 컨트롤러 자신의 폰이 필요할 때는 위 참조를 사용합니다. Enhanced Input을 사용한다면 해당 입력 매핑도 먼저 등록합니다.

폰 (Pawn)과 캐릭터 (Character) 블루프린트

폰 (Pawn)은 컨트롤러가 빙의할 수 있는 Actor입니다. 모든 월드 오브젝트가 Pawn인 것은 아니며, 반드시 보이는 메시나 물리 시뮬레이션을 가질 필요도 없습니다.

폰은 AI 컨트롤러나 플레이어 컨트롤러에 의해 빙의(Possess)될 수 있습니다.

폰에도 입력 처리 로직을 둘 수 있습니다. 이 예제에서는 PlayerController가 입력 의도를 해석하고 Pawn이 월드 행동을 수행하도록 나눕니다.

폰의 역할
  • 월드 내 존재: 필요에 따라 메시, 콜리전, 이동 컴포넌트를 구성합니다.
  • 이동 및 상호작용: 컨트롤러로부터 명령을 받아 이동하고, 다른 오브젝트와 상호작용합니다.
  • 빙의 가능: 플레이어 또는 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: 플레이어 컨트롤러가 특정 폰을 빙의하여 제어권을 얻는 과정입니다. 기본 게임 모드의 플레이어 시작 흐름은 지정된 폰을 스폰하고 빙의합니다. 네트워크 게임의 Possess는 서버 권한에서 수행하며, 사망 뒤 재스폰은 RestartPlayer 같은 게임 모드 흐름을 별도로 호출하도록 구현합니다.
  • 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는 이 과정에서도 유지되므로, 재스폰 후에도 점수가 초기화되지 않습니다.


재스폰은 같은 컨트롤러가 새 Pawn을 제어하는 흐름입니다

동일 PC1이 사망 전 PawnA를 제어하다가 제거/재스폰 후 PawnB를 제어한다. PlayerState 점수 유지와 현재 Pawn 재조회 시점을 구분한다.

PLAYER IDENTITY · CURRENT PAWN

재스폰은 같은 컨트롤러가 새 Pawn을 제어하는 흐름입니다

이 예제는 같은 게임 세션에서 Pawn A를 잃고 Pawn B를 새로 만드는 재스폰입니다. 두 그림은 다른 시점이며, PC 1이 동시에 두 Pawn을 제어한다는 뜻이 아닙니다.

1 · 사망 전

동일PC와현재Pawn의제어관계별개의시점에서동일PC1이현재PawnA를제어한다. 두Pawn을동시에빙의하지않으며이간선은제어관계다.PC 1현재 제어Pawn A
동일PC와현재Pawn의제어관계이시점은PC1→PawnA의단일제어관계다. 다른시점과연결한동시제어가아니다.
PC 1
현재 제어현재 제어PC 1 → Pawn A
Pawn A

2 · 재스폰 후

동일PC와현재Pawn의제어관계별개의시점에서동일PC1이현재PawnB를제어한다. 두Pawn을동시에빙의하지않으며이간선은제어관계다.PC 1현재 제어Pawn B
동일PC와현재Pawn의제어관계이시점은PC1→PawnB의단일제어관계다. 다른시점과연결한동시제어가아니다.
PC 1
현재 제어현재 제어PC 1 → Pawn B
Pawn B

컨트롤러 · Pawn · 플레이어 상태를 분리합니다

Pawn 교체 뒤 Get Controlled Pawn을 다시 조회·검증합니다. 이 재스폰 설계의 PlayerState는 점수를 유지하지만, 디스크 저장이나 모든 레벨 이동의 영속성을 뜻하지 않습니다.

서버에는 각 플레이어의 PC가, 클라이언트에는 자신의 PC가 있습니다. 사망만으로 자동 재스폰되는 것이 아니라 RestartPlayer 등의 경로를 구현합니다.

이 예의 조건

  • 본문과 원 도표에 제시된 사례의 입력·조건을 사용합니다. 설명용 수치나 독립 비교 경로는 각 단계에 표시합니다.
  • 현재 상태·값과 전환 근거의 위치는 모든 단계에서 같습니다. 조건이 맞지 않거나 실행되지 않은 경로를 성공한 동작으로 해석하지 않습니다.
관계도의 보충 설명
원 도표의 제목·노드·관계·조건·주석
범위원문
도표 제목동일 PC와 현재 Pawn의 제어 관계
관계·조건 설명별개의 시점에서 동일 PC1이 현재 PawnA를 제어한다. 두 Pawn에 동시에 빙의하지 않으며 이 간선은 제어 관계다.
관계·조건 설명이 시점은 PC1→PawnA의 단일 제어 관계다. 다른 시점과 연결한 동시 제어가 아니다.
관계·조건 설명별개의 시점에서 동일 PC1이 현재 PawnB를 제어한다. 두 Pawn에 동시에 빙의하지 않으며 이 간선은 제어 관계다.
관계·조건 설명이 시점은 PC1→PawnB의 단일 제어 관계다. 다른 시점과 연결한 동시 제어가 아니다.
예의 값과 변화
관찰·상황값·보충 정보변화·이유
기존 제어

PC1이 PawnA를 제어한다.

  • Controller: PC1
  • 현재 Pawn: A
  • PlayerState에 저장된 점수는 Pawn 객체와 수명이 다르다.
사망·재스폰

PawnA가 끝나고 새 PawnB가 준비된다.

  • Controller: 같은 PC1
  • PawnA: 이전 대상
  • Controller를 새로 만든다고 가정하지 않는다.
새 제어

PC1이 PawnB를 제어하고 현재 Pawn을 재조회한다.

  • 현재 Pawn: B
  • PlayerState: 점수 유지
  • 예전 Pawn 캐시를 계속 쓰지 않도록 연결 시점을 확인한다.

재스폰은 같은 컨트롤러가 새 Pawn을 제어하는 흐름입니다

동일 PC1이 사망 전 PawnA를 제어하다가 제거/재스폰 후 PawnB를 제어한다. PlayerState 점수 유지와 현재 Pawn 재조회 시점을 구분한다.

PLAYER IDENTITY · CURRENT PAWN

재스폰은 같은 컨트롤러가 새 Pawn을 제어하는 흐름입니다

이 예제는 같은 게임 세션에서 Pawn A를 잃고 Pawn B를 새로 만드는 재스폰입니다. 두 그림은 다른 시점이며, PC 1이 동시에 두 Pawn을 제어한다는 뜻이 아닙니다.

1 · 사망 전

동일PC와현재Pawn의제어관계별개의시점에서동일PC1이현재PawnA를제어한다. 두Pawn을동시에빙의하지않으며이간선은제어관계다.PC 1현재 제어Pawn A
동일PC와현재Pawn의제어관계이시점은PC1→PawnA의단일제어관계다. 다른시점과연결한동시제어가아니다.
PC 1
현재 제어현재 제어PC 1 → Pawn A
Pawn A

2 · 재스폰 후

동일PC와현재Pawn의제어관계별개의시점에서동일PC1이현재PawnB를제어한다. 두Pawn을동시에빙의하지않으며이간선은제어관계다.PC 1현재 제어Pawn B
동일PC와현재Pawn의제어관계이시점은PC1→PawnB의단일제어관계다. 다른시점과연결한동시제어가아니다.
PC 1
현재 제어현재 제어PC 1 → Pawn B
Pawn B

컨트롤러 · Pawn · 플레이어 상태를 분리합니다

Pawn 교체 뒤 Get Controlled Pawn을 다시 조회·검증합니다. 이 재스폰 설계의 PlayerState는 점수를 유지하지만, 디스크 저장이나 모든 레벨 이동의 영속성을 뜻하지 않습니다.

서버에는 각 플레이어의 PC가, 클라이언트에는 자신의 PC가 있습니다. 사망만으로 자동 재스폰되는 것이 아니라 RestartPlayer 등의 경로를 구현합니다.

이 예의 조건

  • 본문과 원 도표에 제시된 사례의 입력·조건을 사용합니다. 설명용 수치나 독립 비교 경로는 각 단계에 표시합니다.
  • 현재 상태·값과 전환 근거의 위치는 모든 단계에서 같습니다. 조건이 맞지 않거나 실행되지 않은 경로를 성공한 동작으로 해석하지 않습니다.

관계도의 보충 설명

원 도표의 제목·노드·관계·조건·주석
범위원문
도표 제목동일 PC와 현재 Pawn의 제어 관계
관계·조건 설명별개의 시점에서 동일 PC1이 현재 PawnA를 제어한다. 두 Pawn에 동시에 빙의하지 않으며 이 간선은 제어 관계다.
관계·조건 설명이 시점은 PC1→PawnA의 단일 제어 관계다. 다른 시점과 연결한 동시 제어가 아니다.
관계·조건 설명별개의 시점에서 동일 PC1이 현재 PawnB를 제어한다. 두 Pawn에 동시에 빙의하지 않으며 이 간선은 제어 관계다.
관계·조건 설명이 시점은 PC1→PawnB의 단일 제어 관계다. 다른 시점과 연결한 동시 제어가 아니다.
예의 값과 변화
관찰·상황값·보충 정보변화·이유
기존 제어

PC1이 PawnA를 제어한다.

  • Controller: PC1
  • 현재 Pawn: A
  • PlayerState에 저장된 점수는 Pawn 객체와 수명이 다르다.
사망·재스폰

PawnA가 끝나고 새 PawnB가 준비된다.

  • Controller: 같은 PC1
  • PawnA: 이전 대상
  • Controller를 새로 만든다고 가정하지 않는다.
새 제어

PC1이 PawnB를 제어하고 현재 Pawn을 재조회한다.

  • 현재 Pawn: B
  • PlayerState: 점수 유지
  • 예전 Pawn 캐시를 계속 쓰지 않도록 연결 시점을 확인한다.

핵심 개념 정리

클래스역할과 수명
PlayerController입력·UI·카메라를 관리합니다. 서버와 소유 클라이언트에 존재하며, 폰을 교체해도 유지할 수 있습니다.
Pawn빙의 가능한 월드 Actor입니다. 자체 입력 처리도 가능하며, 재스폰 설계에서는 새 인스턴스로 교체합니다.
CharacterPawn의 하위 클래스입니다. 캡슐·스켈레탈 메시와 CharacterMovementComponent를 포함합니다.

이처럼 언리얼 엔진의 게임플레이 프레임워크는 각 클래스에 명확한 역할을 부여하여, 게임 로직을 체계적으로 분리하고 관리할 수 있도록 돕습니다.

이는 특히 멀티플레이어 환경에서 네트워크 복제 및 동기화를 효율적으로 처리하는 데 필수적입니다.


이번 절에서는 플레이어의 입력과 캐릭터의 움직임을 담당하는 플레이어 컨트롤러와 폰/캐릭터 블루프린트의 역할과 기본적인 설정 방법에 대해 알아보았습니다.

재스폰 뒤 점프가 작동하지 않는 이유 찾기

PC 1은 유지됐지만 Pawn A는 파괴되고 새 Character Pawn B가 빙의됐습니다. 입력 그래프는 게임 시작 때 저장해 둔 Pawn A 참조에 계속 Jump를 호출합니다. 같은 PC가 남았다는 사실만으로 이 참조도 Pawn B로 바뀔까요? 이어 새 폰이 Character가 아닌 일반 Pawn인 변형에서는 어떤 조건을 더 확인해야 할까요?

입력 담당자의 수명과 제어 대상 참조 구분하기

컨트롤러가 유지돼도 과거 Pawn 참조가 자동으로 새 대상이 되지는 않습니다. 입력 시 Get Controlled Pawn으로 현재 Pawn을 조회·유효성 검사하거나 재빙의 때 보관한 참조를 갱신합니다. Pawn B가 Character라면 Character 캐스트 성공 뒤 Jump를 호출합니다. 일반 Pawn이면 캐스트가 실패하므로 그 폰에 맞는 이동/행동 API를 따로 구성합니다. 실패 분기는 호출을 중단하며 캐스트 실패를 네트워크 복제 설정만으로 해결하려 하지 않습니다.

이들은 플레이어와 게임 세계 간의 직접적인 상호작용을 구현하는 데 핵심적인 요소입니다.