PART 7 - 강의 1/2
Epic Online Services
EOS SDK 통합과 매치메이킹 시스템 구현
01
EOS 서비스 개요
Epic Online Services 구성요소
EOS 서비스
┌─────────────────────────────────────────────────────────────┐
│ Epic Online Services (EOS) │
├─────────────────────────────────────────────────────────────┤
│ │
│ [Game Services] │
│ - Lobbies: 로비 생성/참여/관리 │
│ - Sessions: 게임 세션 매칭 │
│ - P2P: NAT Traversal, Relay │
│ - Voice: 음성 채팅 │
│ - Leaderboards: 순위표 │
│ - Achievements: 업적 │
│ - Stats: 통계 │
│ │
│ [Platform Services] │
│ - Connect: 통합 계정 연동 │
│ - Auth: Epic 계정 인증 │
│ - Friends: 친구 시스템 │
│ - Presence: 온라인 상태 │
│ │
│ [모든 플랫폼 무료 사용 가능] │
└─────────────────────────────────────────────────────────────┘
EOS vs Steam
EOS는 플랫폼 독립적이며 무료입니다. Steam, PlayStation, Xbox, Switch 등 모든 플랫폼에서 동일한 API로 크로스플레이를 구현할 수 있습니다.
02
EOS 프로젝트 설정
플러그인 및 초기화
DefaultEngine.ini
[OnlineSubsystem]
DefaultPlatformService=EOS
[OnlineSubsystemEOS]
bEnabled=true
[OnlineSubsystemEOS.Artifact]
ProductId=your_product_id
SandboxId=your_sandbox_id
DeploymentId=your_deployment_id
ClientId=your_client_id
ClientSecret=your_client_secret
[/Script/OnlineSubsystemEOS.NetDriverEOS]
bIsUsingP2PSockets=true
MyGame.Build.cs
public MyGame(ReadOnlyTargetRules Target) : base(Target)
{
PublicDependencyModuleNames.AddRange(new string[]
{
"Core",
"CoreUObject",
"Engine",
"OnlineSubsystem",
"OnlineSubsystemEOS",
"OnlineSubsystemUtils"
});
}
03
로비 시스템 구현
로비 생성과 참여
C++
// 로비 생성
void UMyLobbySubsystem::CreateLobby(int32 MaxPlayers)
{
IOnlineSubsystem* OSS = IOnlineSubsystem::Get();
IOnlineLobbyPtr LobbyInterface = OSS->GetLobbyInterface();
if (!LobbyInterface.IsValid())
return;
// 로비 설정
FOnlineSchemaLobbySettings LobbySettings;
LobbySettings.Set("MaxPlayers", MaxPlayers);
LobbySettings.Set("GameMode", "Deathmatch");
LobbySettings.Set("Map", "Arena01");
// 생성 요청
LobbyInterface->CreateLobby(
GetLocalPlayer()->GetPreferredUniqueNetId().GetUniqueNetId(),
LobbySettings,
FOnLobbyCreated::CreateUObject(
this, &UMyLobbySubsystem::OnLobbyCreated));
}
void UMyLobbySubsystem::OnLobbyCreated(
const FOnlineError& Error,
const FUniqueNetIdRef& LobbyId)
{
if (Error.WasSuccessful())
{
CurrentLobbyId = LobbyId;
UE_LOG(LogNet, Log, TEXT("Lobby created: %s"),
*LobbyId->ToString());
}
else
{
UE_LOG(LogNet, Error, TEXT("Failed to create lobby: %s"),
*Error.GetErrorMessage());
}
}
C++
// 로비 검색 및 참여
void UMyLobbySubsystem::FindLobbies()
{
IOnlineLobbyPtr LobbyInterface =
IOnlineSubsystem::Get()->GetLobbyInterface();
// 검색 조건
FOnlineLobbySearchQuery SearchQuery;
SearchQuery.Filter("GameMode", "Deathmatch",
ESchemaAttributeComparisonOp::Equals);
SearchQuery.Filter("IsJoinable", true,
ESchemaAttributeComparisonOp::Equals);
LobbyInterface->Search(
GetLocalPlayer()->GetPreferredUniqueNetId().GetUniqueNetId(),
SearchQuery,
FOnLobbySearchComplete::CreateUObject(
this, &UMyLobbySubsystem::OnLobbiesFound));
}
void UMyLobbySubsystem::JoinLobby(const FUniqueNetIdRef& LobbyId)
{
IOnlineLobbyPtr LobbyInterface =
IOnlineSubsystem::Get()->GetLobbyInterface();
LobbyInterface->JoinLobby(
GetLocalPlayer()->GetPreferredUniqueNetId().GetUniqueNetId(),
LobbyId,
FOnLobbyJoined::CreateUObject(
this, &UMyLobbySubsystem::OnLobbyJoined));
}
04
매치메이킹 구현
세션 기반 매칭
C++
// 매치메이킹 시작
void UMyMatchmakingSubsystem::StartMatchmaking()
{
IOnlineSessionPtr SessionInterface =
IOnlineSubsystem::Get()->GetSessionInterface();
// 세션 검색 설정
SessionSearch = MakeShareable(new FOnlineSessionSearch());
SessionSearch->MaxSearchResults = 20;
SessionSearch->bIsLanQuery = false;
SessionSearch->QuerySettings.Set(
SEARCH_PRESENCE, true, EOnlineComparisonOp::Equals);
// 검색 시작
SessionInterface->FindSessions(0, SessionSearch.ToSharedRef());
// 완료 델리게이트
SessionInterface->OnFindSessionsCompleteDelegates.AddUObject(
this, &UMyMatchmakingSubsystem::OnFindSessionsComplete);
}
void UMyMatchmakingSubsystem::OnFindSessionsComplete(bool bSuccess)
{
if (!bSuccess || !SessionSearch.IsValid())
return;
// 적합한 세션 선택 (스킬 기반 매칭 로직)
for (const FOnlineSessionSearchResult& Result :
SessionSearch->SearchResults)
{
int32 AvgSkill;
if (Result.Session.SessionSettings.Get("AvgSkill", AvgSkill))
{
if (FMath::Abs(AvgSkill - LocalPlayerSkill) < 100)
{
JoinSession(Result);
return;
}
}
}
// 적합한 세션 없으면 새로 생성
CreateSession();
}
SUMMARY
핵심 요약
- EOS - 플랫폼 독립적인 무료 온라인 서비스
- Lobby - 게임 전 플레이어 모집 및 설정 공유
- Session - 실제 게임 연결을 위한 세션 관리
- Matchmaking - 스킬 기반 자동 매칭
PRACTICE
도전 과제
배운 내용을 직접 실습해보세요
실습 1: EOS 로그인 구현
EOS SDK를 설정하고 IOnlineSubsystem::Get(TEXT("EOS"))로 온라인 서브시스템에 접근하세요. IOnlineIdentity::Login()으로 DevAuth 로그인을 구현하고 콜백에서 결과를 처리하세요.
실습 2: EOS 매치메이킹
IOnlineSession을 사용하여 세션 생성(CreateSession)과 검색(FindSessions)을 구현하세요. FOnlineSessionSettings로 맵, 게임 모드, 최대 인원을 설정하세요.
심화 과제
EOS Lobby와 P2P NAT Traversal을 결합한 매치메이킹 시스템을 구현하세요. EOS Relay를 폴백으로 사용하여 NAT 유형에 관계없이 연결되는 시스템을 완성하세요.