언리얼 호스트 서버 열기 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.