Post

언리얼 호스트 서버 열기 1

언리얼 Listen 서버 열기, 클라이언트 붙기

언리얼 호스트 서버 열기 1

Unreal Engine 멀티플레이: Listen 서버 시스템 정리


1. 서버 생성 및 클라이언트 접속 방식

Listen 서버 생성 (Host)

  • 핵심 개념
    • 호스트(방장)가 클라이언트 역할(플레이)을 동시에 수행하면서 서버를 구동하는 방식이다.
  • 구현 방법
    • 레벨을 열거나 ServerTravel을 수행할 때, 맵 경로 뒤에 옵션 인자로 ?listen을 추가한다. ```cpp GetWorld()->ServerTravel(TEXT(“/Game/Maps/MainMap?listen”), true);

클라이언트 접속 (Join)

  • 핵심 개념
  • 생성된 Listen 서버의 공인 IP와 포트를 통해 클라이언트가 서버 세션에 진입하는 방식이다.

  • 구현 방법
  • 플레이어 컨트롤러를 통해 목적지 IP 주소를 지정하여 이동한다.
1
2
PlayerController->ClientTravel(TEXT("127.0.0.1"), TRAVEL_Absolute);

  • 기본 포트는 7777을 사용하며, 외부 네트워킹을 위해서는 해당 포트의 포트포워딩 설정이 필요하다.

2. 상황별 서버 이동 함수 비교

언리얼 엔진은 서버 및 클라이언트 이동을 위해 다양한 레벨 전환 함수를 제공한다. 상황에 맞는 올바른 함수 선택이 시스템 안정성을 결정한다.

함수명호출 주체주요 용도 및 특징
UEngine::Browse클라이언트 / 서버* 새로운 URL로의 완전히 새로운 하드 전환이다.

* 주로 클라이언트가 메인 메뉴에서 서버 IP를 치고 들어갈 때나, 완전히 다른 서버로 접속을 변경할 때 사용한다.
APlayerController::ClientTravel서버 ➡️ 특정 클라이언트* 서버가 특정 클라이언트 한 명만 지정하여 다른 레벨로 보내거나 다른 서버로 이주(Migration)시킬 때 사용한다.

* 클라이언트가 스스로 로컬 메인 메뉴 맵으로 돌아갈 때도 사용 가능하다.
UWorld::ServerTravel서버 전용 (오직 권한 보유자만 가능)* 서버가 현재 세션에 접속 중인 모든 클라이언트를 동반하여 다 함께 새로운 맵으로 이동할 때 사용한다.

* 멀티플레이 게임 진행 중 다음 스테이지나 인게임 매치 맵으로 넘어갈 때 사용하는 가장 표준적인 함수다.

3. 구조적 개발 방향성 가이드

멀티플레이 프로젝트를 설계할 때 반드시 정립해야 하는 핵심 아키텍처 가이드라인이다.

3-1. 클라이언트 관리 및 진입 프로세스 (GameMode 활용)

  • 역할 분담
  • 클라이언트의 로그인, 접속 승인, 캐릭터 생성(Spawn) 등의 비즈니스 로직은 오직 AGameModeBase에서만 처리한다. GameMode는 서버에만 존재하므로 클라이언트가 변조할 수 없다.

  • 핵심 이벤트 훅
  • OnPostLogin : 클라이언트가 서버 접속에 완전히 성공한 직후 호출되는 함수다. 여기서 해당 플레이어의 PC(PlayerController)를 제어하고, 고유 데이터를 설정하거나 캐릭터를 스폰하여 빙의(Possess)시키는 로직을 시작해야 한다.

3-2. 데이터 동기화의 기준점 (Replication 설계 방향성)

캐릭터와 서버 간 Replicate 범위를 정할 때는 “서버는 검증하고, 클라이언트는 표현한다”는 원칙을 고수해야 한다.

  • 서버 권한 (Server-Authoritative)
  • 체력(HP), 골드, 아이템, 상태 이상 등 게임의 규칙과 승패에 직결되는 핵심 상태 데이터는 오직 서버에서만 연산하고 클라이언트로 Replicate(복제)해야 한다.

  • 클라이언트 예측 (Client Prediction) 및 최적화
  • 이동(Movement)은 엔진의 CharacterMovementComponent가 자체적으로 클라이언트 예측을 지원하므로 이를 적극 활용한다.
  • 피격 이펙트, 사운드, 애니메이션 몽타주 재생 등 단순 ‘시각적 연출’은 변수 복제 대신 RPC(Multicast)를 사용하거나, 조건부로 로컬에서 직접 재생하여 대역폭(Bandwidth)을 아껴야 한다.
This post is licensed under CC BY 4.0 by the author.