UE5 기반 멀티플레이어 게임 개발에서 세션(Session)Net Role/Authority는 핵심적인 요소입니다. 이 문서는 두 주제에 대한 상세한 구현 및 활용 방안을 다룹니다.
(※ 본문 내 일부 링크는 예시이며, 정확한 출처 확인을 권장합니다.)


목차

  1. 세션 관리 (Session Management)
    1. Steam 연동 세션 생성
    2. 커스텀 매치메이킹
    3. 세션 유지 및 중도 참가
  2. Net Role 및 Authority
    1. 클라이언트 예측 & 서버 보정
    2. Role 변경 사례 (소유권 이전 등)
    3. 네트워크 최적화 기법
  3. 결론 및 참고 자료

1. 세션 관리 (Session Management)

멀티플레이에서 세션이란 게임 방을 만들고(Search/Host), 입장(Join)하며, 나가거나(Destroy) 유지하는 전반적 흐름을 관리하는 시스템입니다.
언리얼 엔진에서는 OnlineSubsystem이 이를 담당하며, C++에선 IOnlineSubsystem::Get()GetSessionInterface() 과정을 통해 세션 인터페이스에 접근합니다.

1.1 Steam 연동을 통한 세션 생성 및 참가

Steam OnlineSubsystem을 사용하면, 간단히 세션을 생성하고 검색해 다른 플레이어와 연결할 수 있습니다.
연동을 위해서는:

  1. DefaultEngine.ini에서 OnlineSubsystemSteam 플러그인을 활성화
  2. SteamDevAppId=480(테스트용) 또는 실제 App ID 사용
  3. 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)

  1. Join in Progress

    • bAllowJoinInProgress=true이면 진행 중에도 세션 합류 가능
    • 게임 시작 후 이를 꺼서(혹은 bShouldAdvertise=false) 세션을 잠글 수도 있음(UpdateSession 사용)
    • 중간 참가 시 현재 게임 상태를 GameState/PlayerState 등을 통해 정상 동기화해야 합니다.
  2. 네트워크 끊김 및 복구

    • 클라이언트가 일시적으로 연결을 잃으면 보통 세션에서 빠져나가게 됨
    • 재접속 기능 구현 시, 이전 상태(점수, 위치 등) 복원을 위해 PlayerLogout 시점에 저장 후 새 PlayerController 생성 시 복사
    • Seamless Travel 중엔 CopyProperties() 등을 통해 PlayerState를 이전 맵에서 새 맵으로 이관할 수 있음
  3. 호스트 종료

    • 리스닝 서버의 호스트가 나가면 세션도 종료
    • 호스트 마이그레이션 기능은 UE 기본에는 없음(별도 확장 필요)
  4. 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() 등에서 정리
  • Actor Ownership 수동 변경

    • SetOwner()SetAutonomousProxy(true)를 병행해야 Role이 AutonomousProxy로 바뀜
    • 소유권만 바꾸고 AutonomousProxy를 안 세팅하면 여전히 SimulatedProxy라 RPC 권한이 없음
  • 게임 모드 변경 / 맵 전환

    • Seamless Travel 시 기존 액터 해제 후 새 월드 생성, Role 재할당
    • 팀 변경, 권한 이전이 있으면 관련 RPC·Role 로직 함께 갱신해야 함

중요: Role은 서버가 권위(Authority), 클라이언트가 ‘로컬(Autonomous) vs 원격(Simulated)’를 구분하는 지표입니다. 변경 시점마다 소유주, UI, RPC 권한을 점검해야 합니다.


2.3 네트워크 최적화 기법 (트래픽 절감 및 성능)

  1. 서버-클라이언트 역할 분담: 핵심 로직은 HasAuthority()(서버)에서, 클라서는 시각효과·UI 위주 처리
  2. Replication 조건/범위: COND_OwnerOnly, bOnlyRelevantToOwner, Net Cull Distance 등으로 보낼 대상을 제한
  3. Net Dormancy: 한동안 변경 없는 액터를 DORM_DormantAll로 둬서 업데이트 생략
  4. Replication 주기: NetUpdateFrequency, MinNetUpdateFrequency 조절, 또는 Replication Graph 도입
  5. RPC 신뢰도: 중요 이벤트만 Reliable로, 자주 발생하는 이펙트 등은 Unreliable로 전송 (멀티캐스트 남발 주의)
  6. 불필요한 복제 제거: 중복 프로퍼티/무거운 데이터는 가급적 줄이고, ID 참조 방식 활용
  7. 프로파일링: 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 설계가 핵심입니다.

참고 자료

이 가이드는 UE5 C++ 멀티플레이 구축에 필요한 세션과 Net Role/Authority의 주요 개념 및 예제들을 담고 있습니다. 실제 프로젝트 환경(OnlineSubsystem 설정, 패키징 테스트, 서버 호스팅 등)에 맞춰 적용해 보시길 권장합니다.

위 글은 원본 텍스트의 핵심 내용을 유지하고,
Steam 연동, 커스텀 매치메이킹, 세션 복구, 클라이언트 예측/서버 보정, 
Net Role 변경 사례, 네트워크 최적화 기법 등에 대한
추가 정보를 포함한 마크다운 기반 정리본입니다.

+ Recent posts