UE5 기반 멀티플레이어 게임 개발에서 세션(Session)과 Net Role/Authority는 핵심적인 요소입니다. 이 문서는 두 주제에 대한 상세한 구현 및 활용 방안을 다룹니다.
(※ 본문 내 일부 링크는 예시이며, 정확한 출처 확인을 권장합니다.)
목차
1. 세션 관리 (Session Management)
멀티플레이에서 세션이란 게임 방을 만들고(Search/Host), 입장(Join)하며, 나가거나(Destroy) 유지하는 전반적 흐름을 관리하는 시스템입니다.
언리얼 엔진에서는 OnlineSubsystem이 이를 담당하며, C++에선 IOnlineSubsystem::Get() → GetSessionInterface() 과정을 통해 세션 인터페이스에 접근합니다.
1.1 Steam 연동을 통한 세션 생성 및 참가
Steam OnlineSubsystem을 사용하면, 간단히 세션을 생성하고 검색해 다른 플레이어와 연결할 수 있습니다.
연동을 위해서는:
DefaultEngine.ini에서OnlineSubsystemSteam플러그인을 활성화SteamDevAppId=480(테스트용) 또는 실제 App ID 사용bUseLobbiesIfAvailable=true&bUsesPresence=true옵션 설정
[OnlineSubsystem]
DefaultPlatformService=Steam
[OnlineSubsystemSteam]
bEnabled=true
SteamDevAppId=480
bUseLobbiesIfAvailable=true
bUsesPresence=true
bInitServerOnClient=true
[/Script/OnlineSubsystemSteam.SteamNetDriver]
NetConnectionClassName="OnlineSubsystemSteam.SteamNetConnection"
위 설정 후 C++에서 CreateSession 호출 예시:
IOnlineSubsystem* Subsystem = IOnlineSubsystem::Get();
if (Subsystem)
{
IOnlineSessionPtr SessionInt = Subsystem->GetSessionInterface();
FOnlineSessionSettings SessionSettings;
SessionSettings.bIsLANMatch = false;
SessionSettings.NumPublicConnections = 8;
SessionSettings.bAllowJoinInProgress = true;
SessionSettings.bShouldAdvertise = true;
SessionSettings.bUsesPresence = true;
SessionSettings.bUseLobbiesIfAvailable = true;
SessionSettings.Set(SETTING_MAPNAME, FString("MyMap"), EOnlineDataAdvertisementType::ViaOnlineService);
// 세션 생성 (비동기)
SessionInt->CreateSession(0, NAME_GameSession, SessionSettings);
}
FindSessions / JoinSession로 세션 검색 및 참가가 가능하며, 블루프린트 노드(Create/Find/Join)도 동일한 로직을 수행합니다.
주의: PIE 모드(에디터)에서는 Steam이 제대로 초기화되지 않을 수 있으므로, 패키징된 게임 또는 Standalone Game 환경에서 테스트해야 합니다.
1.2 커스텀 매치메이킹 (ELO 등 사용자 정의 로직)
언리얼 기본 세션 매치메이킹은 세션 브라우저를 만드는 수준입니다.
ELO 같은 레이팅 기반 매치메이킹 구현은 다음 방법이 있습니다:
- 세션 속성에 지표 저장: 예)
SessionSettings.Set(FName("HostELO"), HostEloRating, EOnlineDataAdvertisementType::ViaOnlineService);→ 검색 시 이를 확인해 필터링 - 플랫폼 서비스 활용: Steam, EOS, Xbox Live 등에서 제공하는 클라우드 매치메이킹 API를 직접 호출
- 전용 매치메이킹 서버/서비스: 외부 서버가 대기열을 관리, 매치 성립 시 UE 세션을 생성/조인하도록 안내
- 커스텀 룰 적용: 맵 선호도, 핑 지역, 게임 모드 등 다양한 조건을 세션 설정에 넣어 필터링
매치메이킹 시간 vs 품질: 지나치게 엄격한 조건은 매치가 오래 걸릴 수 있고, 너무 느슨하면 실력 차이가 커질 수 있습니다. 일반적으로 점진적 완화(30초 후 범위 확장 등) 로직을 갖춥니다.
1.3 세션 유지 및 중도 참가 이슈 (끊김, 복구, Join in Progress)
Join in Progress
bAllowJoinInProgress=true이면 진행 중에도 세션 합류 가능- 게임 시작 후 이를 꺼서(혹은
bShouldAdvertise=false) 세션을 잠글 수도 있음(UpdateSession사용) - 중간 참가 시 현재 게임 상태를 GameState/PlayerState 등을 통해 정상 동기화해야 합니다.
네트워크 끊김 및 복구
- 클라이언트가 일시적으로 연결을 잃으면 보통 세션에서 빠져나가게 됨
- 재접속 기능 구현 시, 이전 상태(점수, 위치 등) 복원을 위해
PlayerLogout시점에 저장 후 새PlayerController생성 시 복사 Seamless Travel중엔CopyProperties()등을 통해 PlayerState를 이전 맵에서 새 맵으로 이관할 수 있음
호스트 종료
- 리스닝 서버의 호스트가 나가면 세션도 종료
- 호스트 마이그레이션 기능은 UE 기본에는 없음(별도 확장 필요)
Seamless Travel
- 맵 전환(로비→게임맵 등) 시 세션을 끊지 않고 클라이언트가 자동 이동
- PlayerController/PlayerState 등 일부 정보를 유지하여 부드러운 전환
정리: 세션 관리의 핵심은 세션 생애주기(생성→검색→참가→종료)와 예외 처리(중도 참가, 끊김/복구, 로비→게임맵 전환)이며, UE가 제공하는 델리게이트(OnCreateSessionComplete 등)와
UpdateSession,Seamless Travel기능을 적절히 사용하는 것이 중요합니다.
2. Net Role 및 Authority
언리얼 네트워킹에서 각 Actor는 서버/클라이언트에서 다른 Role 값을 가집니다. 서버에서 Authority(권위)를 갖고, 특정 클라이언트가 자신이 조종하는 Pawn은 AutonomousProxy, 그 외 원격은 SimulatedProxy로 동작합니다.
2.1 클라이언트 예측과 서버 권한 보정 (Client Prediction & Server Reconciliation)
- 클라이언트 예측: 로컬 입력 발생 → 즉시 이동/액션 적용하여 지연 없이 반응
- 서버 권위 검증: 클라이언트가 보낸 입력을 서버가 재계산해 ‘진짜’ 위치/결과를 결정
- 서버 보정: 서버와의 오차가 생기면(패킷 지연 등) 서버가 정확 좌표를 클라에 보내 보정, 클라는 누적 입력을 재시뮬레이션
CharacterMovementComponent가 대표적 예:
ServerMove(),ClientAdjustPosition()으로 자동 처리.
다른 시스템(예: 차량, 탄환)에도 이 개념을 확장해 적용할 수 있습니다.
2.2 Net Role 변경 사례와 처리 (소유권 이전 등)
Pawn 교체(Possess/Unpossess)
- 새 Owner에게 Pawn이
ROLE_AutonomousProxy로 설정 → 입력 제어권 이관 - 이전 소유자는 SimulatedProxy로 전환
- UI, HUD, 컴포넌트 등은
OnPossess()/OnUnPossess()등에서 정리
- 새 Owner에게 Pawn이
Actor Ownership 수동 변경
SetOwner()와SetAutonomousProxy(true)를 병행해야 Role이 AutonomousProxy로 바뀜- 소유권만 바꾸고 AutonomousProxy를 안 세팅하면 여전히 SimulatedProxy라 RPC 권한이 없음
게임 모드 변경 / 맵 전환
- Seamless Travel 시 기존 액터 해제 후 새 월드 생성, Role 재할당
- 팀 변경, 권한 이전이 있으면 관련 RPC·Role 로직 함께 갱신해야 함
중요: Role은 서버가 권위(Authority), 클라이언트가 ‘로컬(Autonomous) vs 원격(Simulated)’를 구분하는 지표입니다. 변경 시점마다 소유주, UI, RPC 권한을 점검해야 합니다.
2.3 네트워크 최적화 기법 (트래픽 절감 및 성능)
- 서버-클라이언트 역할 분담: 핵심 로직은
HasAuthority()(서버)에서, 클라서는 시각효과·UI 위주 처리 - Replication 조건/범위:
COND_OwnerOnly,bOnlyRelevantToOwner,Net Cull Distance등으로 보낼 대상을 제한 - Net Dormancy: 한동안 변경 없는 액터를
DORM_DormantAll로 둬서 업데이트 생략 - Replication 주기:
NetUpdateFrequency,MinNetUpdateFrequency조절, 또는 Replication Graph 도입 - RPC 신뢰도: 중요 이벤트만 Reliable로, 자주 발생하는 이펙트 등은 Unreliable로 전송 (멀티캐스트 남발 주의)
- 불필요한 복제 제거: 중복 프로퍼티/무거운 데이터는 가급적 줄이고, ID 참조 방식 활용
- 프로파일링:
stat net, Network Profiler, Replication Graph Stats 등을 이용해 병목 지점 파악
이렇게 Role/Authority 구조와 언리얼의 다양한 네트워크 기능(dormancy, replic conditions, Graph 등)을 적절히 활용하면 대규모 멀티플레이에서도 성능과 안정성을 보장할 수 있습니다.
결론 및 참고 자료
정리:
- 세션 관리는 Host/Find/Join/Destroy 뿐 아니라 Steam 연동, 매치메이킹, 중도 참가, Seamless Travel 등 다양한 시나리오를 다룹니다.
- Net Role/Authority는 “서버=권위, 클라이언트=Autonomous/Simulated” 구조이며, 예측 & 보정, 소유권 이전, 효율적 Replication 설계가 핵심입니다.
참고 자료
- Unreal Engine Official Docs: Networking and Multiplayer
- Cedric Neukirchen's Multiplayer Compendium (Session & RPC)
- Epic Developer Community Forums - Net Role Discussions
- Reddit - UE4/UE5 Large Scale Replication Tips
이 가이드는 UE5 C++ 멀티플레이 구축에 필요한 세션과 Net Role/Authority의 주요 개념 및 예제들을 담고 있습니다. 실제 프로젝트 환경(OnlineSubsystem 설정, 패키징 테스트, 서버 호스팅 등)에 맞춰 적용해 보시길 권장합니다.
위 글은 원본 텍스트의 핵심 내용을 유지하고,
Steam 연동, 커스텀 매치메이킹, 세션 복구, 클라이언트 예측/서버 보정,
Net Role 변경 사례, 네트워크 최적화 기법 등에 대한
추가 정보를 포함한 마크다운 기반 정리본입니다.'UnraealEngine' 카테고리의 다른 글
| 언리얼 엔진 5 리플리케이션(Replication) 심층 가이드 (0) | 2025.03.14 |
|---|---|
| 언리얼 엔진 5에서 스팀 OSS 기능 구현 가이드 (0) | 2025.03.13 |
| UE5 C++ 멀티플레이어: RPC & 리플리케이션 심층 가이드 (0) | 2025.03.13 |
| Unreal4 이벤트와 델리게이트 처리하기 5)TimeofDay 핸들러 생성 (0) | 2021.08.25 |
| Unreal4 이벤트와 델리게이트 처리하기 5)사용자 정의 이벤트 생성 (0) | 2021.08.24 |