Steamworks 문서
Steam 매치메이킹 및 로비

개요

Steam P2P 매치메이킹은 로비 개념을 중심으로 설계되었습니다. 로비는 Steam 백앤드 서버에 존재하는 개체로 채팅방과 매우 비슷합니다. 사용자는 새 로비를 만들고, 로비와 데이터를 연결하고, 해당 데이터를 기초로 로비를 검색하고, 로비에 들어가고, 로비에 있는 다른 사용자와 정보를 공유할 수 있습니다. 대다수 게임의 플레이어는 2~16명이지만, 로비는 하나당 최대 250명의 사용자를 수용할 수 있습니다. 스킬 기반 매치메이킹은 이 시스템을 토대로 만들어졌습니다.

Steam P2P 매치메이킹 API는 사용자가 함께 플레이할 다른 사용자를 찾을 수 있도록 도와주는 기능 모음입니다. 기능은 모두 ISteamMatchmaking에 있으며 여기에는 각 기능의 매개변수에 대한 자세한 정보가 담겨 있습니다. 로비는 사용자나 게임 서버처럼, 고유한 Steam ID로 식별됩니다. 자세한 로비 구현 사례는 ‘Steamworks 예시’를 통해 확인할 수 있습니다.

매치메이킹 과정 흐름

함께 플레이할 그룹을 모으는 일반적인 방법은 다음과 같습니다.
  1. 사용자가 게임에서 멀티플레이로 플레이할 것을 선택하고 원하는 멀티플레이어의 종류(규칙, 시나리오 등)를 설정합니다.
  2. 게임이 로비 검색 API를 사용하여 사용자가 원하는 규칙과 비슷한 규칙을 설정한 로비를 검색합니다.
  3. 로비를 발견하면 해당 로비로 연결됩니다. 로비를 찾지 못하면 새로운 로비를 만듭니다.
  4. 사용자는 게임 시작에 필요한 최소 인원이 채워질 때까지 로비에서 대기합니다. 로비에 참가한 멤버들은 플레이할 캐릭터나 사용자별 설정에 대한 데이터를 서로 전달합니다. 로비에 적용해야 할 규칙이 있는 경우(예를 들어 특정 캐릭터는 오직 한 명만 플레이할 수 있음), 로비 주인(1명)만 그 조정 권한을 가질 수 있습니다.
  5. 로비와 관련된 사용자 인터페이스는 있을 수도 있고 없을 수도 있습니다. 인터페이스가 있는 경우 로비 데이터 통신 기능을 사용해 로비 사용자가 서로 채팅 메시지를 보낼 수 있습니다. 음성 데이터를 보내려면 Steam 네트워킹 API가 필요합니다.
  6. 게임을 시작할 준비가 완료되면 모든 사용자는 게임 서버에 입장하거나 게임을 호스팅하기로 한 사용자와 연결한 후 로비를 떠나게 됩니다. 모든 사용자가 로비를 떠나면 로비는 자동으로 소멸됩니다.

로비 검색

게임에서 로비를 검색할 수 있도록 하려면 ISteamMatchmaking::RequestLobbyList를 호출해야 합니다.
이 기능는 비동기 호출로써 SteamAPICall_t 핸들을 반환해 요청 상태를 트래킹하는 데 사용할 수 있습니다. Steam 백앤드와 사용자의 연결 상태에 따라 이 호출은 완료될 때까지 300밀리초에서 5초까지 걸릴 수 있고 시간 초과 기준은 20초입니다.
반환되는 결과의 수가 LobbyMatchList_t 호출 결과에 나타나면 ISteamMatchmaking::GetLobbyByIndex로 이를 모두 반복하여 해당 ID를 받을 수 있습니다.
최대 50개의 결과가 반환될 수 있지만 실제 반환되는 결과는 보통 두 개 이하입니다. 결과는 지리적 거리순으로 반환되며 설정된 근사 필터에 기반합니다. 기본적으로, 이미 가득 찬 로비는 반환하지 않으며 거리 필터는 k_ELobbyDistanceFilterDefault(근사)로 설정됩니다. 필터를 추가하려면 RequestLobbyList를 호출하기 전에 다음과 같은 필터링을 하나 이상 호출해야 합니다.

로비 만들기

사용자가 참여할 수 있는 로비를 찾을 수 없을 경우, 새로운 로비를 만듭니다.
ISteamMatchmaking::CreateLobby를 호출한 후 완료될 때까지 기다리세요. 호출 결과에 성공 여부가 나타나며 성공할 경우 LobbyCreated_t 구조로 해당 로비의 steamID를 반환할 것입니다. 이는 로비에 대한 메타데이터를 설정하는 데 사용됩니다. 로비를 생성한 후 가장 먼저 해야 할 일은 로비에 대한 데이터를 설정하는 것입니다. 이 데이터를 가지고 다른 게임 클라이언트가 해당 로비를 검색할 수 있습니다(아래 참고).

로비 참가하기

검색 또는 친구를 통해 마음에 드는 로비를 찾으면 ISteamMatchmaking::JoinLobby를 사용한 후 LobbyEnter_t 호출 결과를 기다립니다. 로비에 들어가면 로비 데이터 API를 사용해 해당 로비에 대한 세부 정보를 수집하고 표시할 사항이 있는 경우, 해당 사항을 정합니다.

사용자가 로비에 들어오고 나가면 LobbyChatUpdate_t 콜백이 로비 주인과 로비에 있는 모든 사용자에게 게시됩니다.

현재 로비에 있는 사용자를 반복하려면 다음 API를 사용하세요.

로비 안의 다른 사용자에 대한 정보를 얻으려면 친구 API를 사용해야 합니다. 자세한 내용은 친구, 초대 및 로비 문서를 참고하세요.

로비 메타데이터

로비 메타데이터를 사용하면 로비 이름, 현재 맵, 게임 모드, 현재 게임 상태를 포함한 로비의 모든 상태를 임의로 설정할 수 있습니다.

사용자는 가장 최근에 참여한 로비의 데이터를 자동으로 가지게 됩니다. 그리고 검색 결과로 반환된 로비의 경우, 사용자는 검색을 수행한 시점의 로비 데이터를 가지게 됩니다. 해당 로비가 친구의 로비였다면 ISteamMatchmaking::RequestLobbyData가 호출되어 성공적으로 완료되기 전에는 로비 데이터를 사용할 수 없습니다.

로비에서 로비 데이터가 변경될 경우 로비 안의 모든 사용자가 LobbyDataUpdate_t 콜백을 수신합니다. 이 콜백은 ISteamMatchmaking::RequestLobbyData 호출이 완료되었음을 알리는 방식과 같습니다.

다음은 로비 데이터를 수신하고 설정하는 데 사용할 수 있는 기능 모음입니다. 로비 데이터는 로비 주인만 설정하고 삭제할 수 있습니다.

다음은 메타데이터를 반복할 수 있게 해주는 기능입니다. 이 기능은 보통 디버깅 목적으로만 사용됩니다.

다음 기능을 사용하면 로비에서 사용자들이 메타데이터를 설정할 경우 다른 사용자가 업데이트를 수신할 수 있습니다.

로비 내 커뮤니케이션

로비 안에서 채팅 메시지나 게임 시작 신호와 같은 정보를 보내려면 ISteamMatchmaking::SendLobbyChatMsg를 호출하면 됩니다. 이 기능을 사용하면 로비에 있는 모든 사용자에게 간단한 바이너리 메시지가 전송됩니다. 로비에 있는 사용자들은 ISteamMatchmaking::LobbyChatMsg_t 콜백 수신을 대기해야 합니다. 콜백을 수신하면 ISteamMatchmaking::GetLobbyChatEntry를 사용해 메시지 내용을 가져올 수 있습니다.

친구, 초대 및 로비

친구 API를 사용하면 사용자의 친구가 참여 중인 모든 로비를 찾을 수 있습니다.
int cFriends = SteamFriends()->GetFriendCount( k_EFriendFlagImmediate ); for ( int i = 0; i < cFriends; i++ ) { FriendGameInfo_t friendGameInfo; CSteamID steamIDFriend = SteamFriends()->GetFriendByIndex( i, k_EFriendFlagImmediate ); if ( SteamFriends()->GetFriendGamePlayed( steamIDFriend, &friendGameInfo ) && friendGameInfo.m_steamIDLobby.IsValid() ) { // friendGameInfo.m_steamIDLobby는 유효한 로비이며, 참가할 수도 있고, RequestLobbyData()를 사용해 메타데이터를 얻을 수도 있습니다 } }

ISteamMatchmaking::InviteUserToLobby를 사용하면 친구를 로비에 초대할 수 있습니다.
해당 사용자는 게임에 참여할 수 있는 링크가 포함된 채팅 대화 상자를 수신하게 됩니다. 사용자가 게임을 실행하고 있지 않은 상태에서 링크를 클릭하면
+connect_lobby <64-bit lobby id> 명령줄로 게임이 실행됩니다. 귀사의 앱에 ISteamApps::GetLaunchCommandLine이 적용되었는지 확인하세요. 명령줄을 통해 앱을 시작할 때 나타나는 팝업 경고를 비활성화할 수 있습니다.

사용자가 이미 게임에 접속한 상태라면 ISteamFriends::GameLobbyJoinRequested_t 콜백이 게시됩니다. 여기에는 사용자가 참가하려는 로비의 Steam ID가 담겨 있습니다. 이 콜백을 따를 것인지 여부는 게임이 결정합니다.

사용자가 친구 목록에서 친구를 선택해 로비로 초대할 수 있게 하려면 ISteamFriends::ActivateGameOverlayInviteDialog를 호출하면 됩니다.
이 기능을 사용하면 현재 로비로 친구를 초대하기 위해 설계된 Steam 게임 내 오버레이가 활성화됩니다.

인증

Steam 로비에 있는 모든 사용자는 Steam 백앤드에서 이미 인증을 통과한 사용자입니다. VAC 차단이 적용된 사용자인지(Valve Anti-Cheat 기술 참조) 확인하는 것 외에 게임에서 추가로 인증 절차를 밟을 필요가 없습니다. 사용자가 같은 계정으로 다른 위치에서 로그인을 시도할 경우, 먼저 로그인한 위치에서 입장했던 로비에서 자동으로 퇴장하게 됩니다.

정리

게임이 시작되면 각 사용자는 다음 기능을 사용해 로비에서 나가게 됩니다.
ISteamMatchmaking::LeaveLobby
모든 사용자가 로비를 떠나면 로비는 자동으로 소멸됩니다.

로비 관련 팁

  • 일반적으로, 필요한 경우에만 로비를 만드세요. 예를 들어, 사용자가 친구를 게임 플레이에 초대하거나 로비가 필요한 수동 조치를 트리거했을 경우입니다.
  • 로비의 메타데이터를 너무 자주 업데이트하지 마세요. 검색에 사용되는 메타데이터와 값(예: 게임 유형이나 게임 상태)만 추가하세요. 로비 검색은 이용 가능한 로비만 검색할 수 있게 되어 있으므로 플레이어 수를 입력할 필요가 없습니다.
  • 메타데이터를 알아낼 목적으로 로비에 참가하지 마세요. 모든 로비의 메타데이터는 개별적으로 다운로드할 수 있습니다. 게임은 해당 메타데이터를 사용하여 로비 목록을 사용자에게 보여주고 직접 고르게 하거나, 사용자가 참가할 로비를 게임이 자동으로 검색 결과에서 결정할 수 있습니다.

다른 질문이 있으신가요?

Steam 매치메이킹 및 로비 토론 포럼에 질문을 남겨 주세요.