내일배움캠프_언리얼9기

내일배움캠프 70일차 TIL 2026/07/31

begin-play 2026. 7. 31. 21:36

[TIL] 언리얼 엔진 멀티플레이: Local vs Remote 메모리 구조와 실행 모드(Net Mode)에 따른 에러 해결

📌 오늘 마주친 문제 (Issue)

AMyPawn의 BeginPlay()와 PossessedBy()에서 디버그 출력 코드를 실행했으나, 게임 화면에 메시지가 뜨지 않고 아래와 같은 에러 로그가 발생함.

Plaintext
 
PIE: Error: Only Local Player Controllers can be assigned to widgets. 
BP_PlayerController_C_0 is not a Local Player Controller.

💡 원인 분석 (Root Cause)

1. Local과 Remote / Server의 메모리 구조 차이

  • Local Player Controller (진짜 내 컨트롤러):
  • 내 컴퓨터의 모니터(Viewport) 화면 및 키보드/마우스 입력과 직접 연결되어 있는 진짜 플레이어 객체. 화면에 UI 위젯이나 디버그 메시지를 그릴 권한이 있음.
  • Not Local / Remote / Server Controller (복사본 및 서버 관리자):
    • ⚠️ 핵심: 이들은 내 모니터 화면(Viewport)과 직접 연결되어 있지 않음.
  • 네트워크 동기화를 위해 내 컴퓨터 메모리에 복사본으로 존재하는 상대방 캐릭터이거나, 백그라운드에서 논리 연산만 수행하는 서버 전용 컨트롤러.

2. 에러가 발생한 이유 (초기 실행 모드 문제)

기존 실행 모드(Dedicated Server 또는 Client 독립 실행)에서는 PossessedBy() 같은 서버 전용 이벤트가 화면(Viewport)이 아예 존재하지 않는 순수 서버 컨트롤러 상에서 실행됨.

화면이 없는 서버 컨트롤러가 화면 출력 메시지/위젯을 직접 띄우려고 시도하자, 언리얼 엔진이 *"화면도 없는 컨트롤러가 왜 화면에 위젯을 그리려고 하냐"*라며 에러를 내고 출력을 취소해 버린 것임.

🛠️ 해결 방법 (Solution)

코드를 수정하지 않고 에디터 설정(Net Mode) 변경으로 해결!

  1. 에디터 상단 [플레이(Play)] 버튼 옆의 ... (점 3개 아이콘) 클릭
  2. [Net Mode (네트워크 모드)] $\rightarrow$ Play As Listen Server (리슨 서버로 플레이)로 변경

🎯 변경 후 정상 작동하는 이유

  • Listen Server 모드로 변경하면 1번 플레이어(방장)가 서버(Authority) 역할을 함과 동시에 내 모니터 화면(Local Viewport)을 소유한 존재가 됨.
  • 따라서 C++ 코드를 고치지 않아도 서버에서 호출되는 PossessedBy() 등의 로직이 화면을 가진 Local Player Controller를 통해 올바르게 전달되어 에러 없이 화면에 디버그 텍스트가 표시됨.

🚀 연관 멀티플레이 필수 개념 정리

오늘 배운 개념을 바탕으로, 언리얼 멀티플레이 개발 시 함께 쓰이는 핵심 판별 기능들:

함수 / 개념 설명 주요 사용 위치
IsLocalController() 이 컨트롤러가 현재 내 모니터/입력장치를 직접 다루는 진짜 내 플레이어인가? UI 띄우기, 카메라 조종, HUD 업데이트
HasAuthority() 이 액터/코드 실행 주체가 모든 판정 권한을 가진 **서버(Server)**인가? 데미지 계산, 아이템 획득, 체력 차감, 스폰
IsLocallyControlled() (APawn 전용) 이 폰(Pawn)을 조종하는 컨트롤러가 내 로컬 컨트롤러인가? 캐릭터 애니메이션, 로컬 사운드/이펙트 재생
GetLocalRole() 이 액터의 로컬 기준 역할 (ROLE_Authority, ROLE_AutonomousProxy, ROLE_SimulatedProxy) 디버그 출력, 네트워크 권한 상태 확인

📝 배운 점 (Summary)

  1. 화면(Viewport)이 존재한다는 것과 메모리에 존재한다는 것은 완전히 다르다.
  2. Dedicated Server 모드에서는 서버 측 액터/컨트롤러에 화면이 존재하지 않으므로 화면 출력 디버그 메시지가 취소되거나 에러가 날 수 있다.
  3. 멀티플레이어 디버깅 시 Listen Server 모드를 활용하면 서버 로직 수행과 화면(Local Viewport) 출력을 동시에 직관적으로 확인할 수 있다.