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 컨트롤러 입력 풀을 분리하는 입력 기반 매치메이킹을 구현하세요. 게임 중 입력 방식 전환을 감지하고 서버에 알리는 시스템까지 완성하세요.