PART 7 - 강의 2/2

크로스플레이 구현

PC, 콘솔, 모바일 간 통합 멀티플레이어

01

크로스플레이 아키텍처

통합 계정과 세션 관리

아키텍처 ┌─────────────────────────────────────────────────────────────┐ │ 크로스플레이 아키텍처 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ [PC] [PS5] [Xbox] [Switch] [Mobile] │ │ │ │ │ │ │ │ │ └──────────┼──────────┼──────────┼──────────┘ │ │ v v v │ │ ┌─────────────────────────────────┐ │ │ │ EOS Connect (통합 계정) │ │ │ └─────────────────────────────────┘ │ │ │ │ │ ┌────────────────┼────────────────┐ │ │ v v v │ │ [Lobbies] [Sessions] [P2P/Relay] │ │ │ │ - 플랫폼별 네이티브 계정 → EOS ProductUserId 매핑 │ │ - 통합 세션/로비로 크로스플랫폼 매칭 │ │ - NAT Traversal + Relay로 P2P 연결 │ │ │ └─────────────────────────────────────────────────────────────┘
02

EOS Connect 통합 계정

플랫폼 계정 연동

C++ // 플랫폼 인증 후 EOS Connect 로그인 void UMyCrossplaySubsystem::LoginWithPlatformCredentials() { IOnlineSubsystem* PlatformOSS = IOnlineSubsystem::GetByPlatform(); IOnlineIdentityPtr PlatformIdentity = PlatformOSS->GetIdentityInterface(); // 플랫폼 자격 증명 획득 FString PlatformToken = PlatformIdentity->GetAuthToken(0); FString PlatformType = GetPlatformType(); // "steam", "psn", "xbl" 등 // EOS Connect 로그인 IOnlineSubsystem* EOSOSS = IOnlineSubsystem::Get("EOS"); IOnlineIdentityPtr EOSIdentity = EOSOSS->GetIdentityInterface(); FOnlineAccountCredentials Credentials; Credentials.Type = PlatformType; Credentials.Token = PlatformToken; EOSIdentity->Login(0, Credentials); EOSIdentity->OnLoginCompleteDelegates[0].AddUObject( this, &UMyCrossplaySubsystem::OnEOSLoginComplete); } void UMyCrossplaySubsystem::OnEOSLoginComplete( int32 LocalUserNum, bool bSuccess, const FUniqueNetId& UserId, const FString& Error) { if (bSuccess) { // ProductUserId 획득 - 크로스플레이 식별자 FString ProductUserId = UserId.ToString(); UE_LOG(LogNet, Log, TEXT("EOS Login: %s"), *ProductUserId); } }
ProductUserId

EOS Connect의 ProductUserId는 플랫폼 독립적인 식별자입니다. 같은 사용자가 여러 플랫폼에서 플레이해도 동일한 ID를 사용합니다.

03

크로스플랫폼 세션

플랫폼 간 매칭

C++ // 크로스플레이 세션 생성 void UMyCrossplaySubsystem::CreateCrossplaySession() { IOnlineSubsystem* OSS = IOnlineSubsystem::Get("EOS"); IOnlineSessionPtr Sessions = OSS->GetSessionInterface(); FOnlineSessionSettings SessionSettings; SessionSettings.NumPublicConnections = 8; SessionSettings.bIsLANMatch = false; SessionSettings.bUsesPresence = true; SessionSettings.bAllowJoinInProgress = true; SessionSettings.bAllowInvites = true; // 크로스플레이 활성화 SessionSettings.bAllowCrossPlay = true; // 플랫폼 정보 저장 (선택적 필터링용) SessionSettings.Set("HostPlatform", GetPlatformName(), EOnlineDataAdvertisementType::ViaOnlineService); // 입력 장치 정보 (공정성 매칭용) SessionSettings.Set("InputType", GetInputTypeName(), EOnlineDataAdvertisementType::ViaOnlineService); Sessions->CreateSession(0, NAME_GameSession, SessionSettings); } // 크로스플레이 세션 검색 void UMyCrossplaySubsystem::FindCrossplaySessions(bool bCrossplayEnabled) { IOnlineSessionPtr Sessions = IOnlineSubsystem::Get("EOS")->GetSessionInterface(); SessionSearch = MakeShareable(new FOnlineSessionSearch()); if (!bCrossplayEnabled) { // 같은 플랫폼만 검색 SessionSearch->QuerySettings.Set( "HostPlatform", GetPlatformName(), EOnlineComparisonOp::Equals); } // 입력 장치 기반 필터 (선택적) if (bFilterByInput) { SessionSearch->QuerySettings.Set( "InputType", GetInputTypeName(), EOnlineComparisonOp::Equals); } Sessions->FindSessions(0, SessionSearch.ToSharedRef()); }
04

NAT Traversal과 Relay

P2P 연결 보장

C++ // EOS P2P 설정 void UMyCrossplaySubsystem::ConfigureP2P() { IOnlineSubsystem* OSS = IOnlineSubsystem::Get("EOS"); // NetDriver 설정에서 P2P 활성화 // DefaultEngine.ini: // [/Script/OnlineSubsystemEOS.NetDriverEOS] // bIsUsingP2PSockets=true } // 연결 타입 확인 void UMyCrossplaySubsystem::CheckConnectionType() { // EOS SDK는 자동으로 최적 경로 선택: // 1. Direct P2P (NAT가 허용하는 경우) // 2. NAT Traversal (STUN/TURN) // 3. Relay (직접 연결 불가 시) }
NAT 타입 ┌───────────────────────────────────────────────────────┐ │ NAT 타입별 연결성 │ ├───────────────────────────────────────────────────────┤ │ │ Open │ Moderate │ Strict │ │ ├──────────────┼──────┼──────────┼────────┤ │ │ Open │ O │ O │ O │ │ │ Moderate │ O │ O │ X │ │ │ Strict │ O │ X │ X │ │ ├──────────────┴──────┴──────────┴────────┤ │ │ X = Relay 필요 │ │ │ EOS P2P가 자동으로 Relay 폴백 제공 │ │ └───────────────────────────────────────────────────────┘
Relay 비용

EOS Relay는 무료로 제공되지만, 지연 시간이 추가됩니다. 게임 설계 시 Relay 환경(+30-50ms)도 고려하세요.

SUMMARY

핵심 요약

  • EOS Connect - 플랫폼 계정을 통합 ProductUserId로 연동
  • 크로스플레이 세션 - bAllowCrossPlay로 플랫폼 간 매칭
  • 입력 기반 필터 - 컨트롤러/키마 분리 매칭 가능
  • NAT Traversal - EOS P2P가 자동으로 최적 경로 선택
PRACTICE

도전 과제

배운 내용을 직접 실습해보세요

실습 1: 플랫폼별 입력 감지

FPlatformMisc::GetPlatformName()과 입력 디바이스 감지를 사용하여 PC/콘솔/모바일 플레이어를 구분하는 시스템을 구현하세요. 플랫폼 정보를 PlayerState에 복제하세요.

실습 2: 크로스플레이 매칭 풀

EOS Session의 커스텀 어트리뷰트로 플랫폼 타입을 태깅하고, FindSessions에서 크로스플레이 옵트인/아웃 필터링을 구현하세요.

심화 과제

키보드/마우스 vs 컨트롤러 입력 풀을 분리하는 입력 기반 매치메이킹을 구현하세요. 게임 중 입력 방식 전환을 감지하고 서버에 알리는 시스템까지 완성하세요.