멀티 플레이어 관리자를 사용하는 SmartMatch로 멀티 플레이어 게임 찾기
이 항목에서는 멀티 플레이어 관리자를 사용하여 SmartMatch 매치 메이킹을 구현하는 데 필요한 기본 단계를 설명합니다.
게임을 플레이하고자 할 때 게이머에게 온라인 상태인 친구가 충분하지 않거나 온라인에서 무작위의 사람들과 플레이하고자 할 수 있습니다. SmartMatch 서비스를 사용하여 다른 Xbox 플레이어를 찾을 수 있습니다.
매치 찾기
다음 단계에서는 멀티 플레이어 관리자를 사용하여 플레이어가 진행 중인 게임에 참가할 수 있도록 플레이어의 친구에게 초대를 보냅니다.
1, 2, 3 및 5단계는 초대를 수행하는 장치에서 이루어집니다. 4단계는 일반적으로 초대 대상자의 디바이스에서 시작되며, 프로토콜 활성화를 통한 앱 실행 이후 개시됩니다.
자세한 내용은 SmartMatch 매치 메이킹을 사용한 게임 플레이(순서도)를 참조하세요.
멀티 플레이어 관리자 초기화
로비 세션 개체는 멀티 플레이어 관리자가 유효한 세션 템플릿 이름으로 초기화될 때 자동으로 생성됩니다. 세션 템플릿은 서비스 구성에 정의됩니다.
참고 항목
사용자가 추가될 때까지 서비스의 로비 세션 인스턴스가 만들어지지 않습니다.
플랫 C API
HRESULT hr = XblMultiplayerManagerInitialize(lobbySessionTemplateName, queueUsedByMultiplayerManager);
자세한 내용은 XblMultiplayerManagerInitialize 를 참조하세요.
로컬 사용자를 추가하여 로비 세션 생성
로컬로 로그인한 Xbox 서비스 사용자를 로비 세션에 추가합니다. 첫 번째 사용자가 추가될 때 새 로비를 호스트합니다. 다른 모든 사용자는 기존 로비에 보조 사용자로 추가됩니다.
멀티 플레이어 관리자는 참가할 친구들을 위해 셸의 로비를 홍보합니다. 로컬 사용자를 추가한 후에만 초대를 전송하고, 로비 속성을 설정하고, 로비 멤버에 액세스할 수 있습니다.
로컬 사용자가 로비에 참가할 때 연결 주소와 사용자 지정 속성을 설정하는 것이 좋습니다.
로컬 방식으로 로그인한 모든 사용자에 대해 이 프로세스를 반복해야 합니다.
단일 로컬 사용자 추가
플랫 C API
HRESULT hr = XblMultiplayerManagerLobbySessionAddLocalUser(xblUserHandle);
if (!SUCCEEDED(hr))
{
// Handle failure.
}
// Set member connection address.
const char* connectionAddress = "1.1.1.1";
hr = XblMultiplayerManagerLobbySessionSetLocalMemberConnectionAddress(
xblUserHandle, connectionAddress, context);
if (!SUCCEEDED(hr))
{
// Handle failure.
}
// Set custom member properties.
const char* propName = "Name";
const char* propValueJson = "{}";
hr = XblMultiplayerManagerLobbySessionSetProperties(propName, propValueJson, context);
if (!SUCCEEDED(hr))
{
// Handle failure.
}
...
자세한 내용은 다음을 참조하세요.
- XblMultiplayerManagerLobbySessionAddLocalUser
- XblMultiplayerManagerLobbySessionSetLocalMemberConnectionAddress
- XblMultiplayerManagerLobbySessionSetProperties
다중 로컬 사용자 추가
플랫 C API
std::vector<XblUserHandle> xblUsers;
for (XblUserHandle xblUserHandle : xblUsers)
{
HRESULT hr = XblMultiplayerManagerLobbySessionAddLocalUser(xblUserHandle);
if (!SUCCEEDED(hr))
{
// Handle failure.
}
// Set member connection address.
const char* connectionAddress = "1.1.1.1";
hr = XblMultiplayerManagerLobbySessionSetLocalMemberConnectionAddress(
xblUserHandle, connectionAddress, context);
if (!SUCCEEDED(hr))
{
// Handle failure.
}
// Set custom member properties.
const char* propName = "Name";
const char* propValueJson = "{}";
hr = XblMultiplayerManagerLobbySessionSetProperties(propName, propValueJson, context);
...
}
자세한 내용은 다음을 참조하세요.
- XblMultiplayerManagerLobbySessionAddLocalUser
- XblMultiplayerManagerLobbySessionSetLocalMemberConnectionAddress
- XblMultiplayerManagerLobbySessionSetProperties
변경 사항은 다음 XblMultiplayerManagerDoWork 호출 시에 일괄 처리됩니다.
멀티 플레이어 관리자는 로컬 사용자가 로비 세션에 추가될 때마다 XblMultiplayerEventType::UserAdded
이벤트를 발송합니다.
해당 사용자가 성공적으로 추가되었는지 확인하려면 이벤트의 오류 코드를 검사하는 것이 좋습니다. 오류가 발생한 경우 오류 원인을 세부적으로 설명한 오류 메시지가 제공됩니다.
멀티 플레이어 관리자는 다음 기능을 수행하여 로컬 사용자를 추가하여 로비 세션을 생성합니다.
- Xbox 서비스 멀티 플레이어 서비스에 실시간 활동 및 멀티 플레이어 구독을 등록합니다.
- 로비 세션을 만듭니다.
- 모든 로컬 플레이어를 활성 상태로 가입하세요.
- SDA(보안 디바이스 주소)를 업로드합니다.
- 멤버 속성을 설정합니다.
- 세션 변경 이벤트에 등록하세요.
- 로비 세션을 활성 세션으로 설정합니다.
친구에게 초대 보내기(선택 사항)
플레이어가 게임에 초대할 친구 또는 최근 플레이어를 선택할 수 있는 표준 Xbox UI를 표시합니다. 플레이어가 선택 확인을 누르면 멀티 플레이어 관리자가 선택된 플레이어에게 초대를 보냅니다.
또한 게임에서 XblMultiplayerManagerLobbySessionInviteUsers 메서드를 사용하여 Xbox 서비스 사용자 ID로 정의한 플레이어 집합에 초대를 보낼 수도 있습니다. 이 방법은 표준 Xbox UI 대신 자체 게임 내 UI 사용할 때 유용합니다.
플랫 C API
size_t xuidsCount = 1;
uint64_t xuids[1] = {};
xuids[0] = 1234567891234567;
HRESULT hr = XblMultiplayerManagerLobbySessionInviteUsers(
xblUserHandle,
xuids,
xuidsCount,
nullptr, // ContextStringId
nullptr // CustomActivationContext
);
자세한 내용은 XblMultiplayerManagerLobbySessionInviteUsers를 참조하세요.
멀티 플레이어 관리자는 다음 기능을 수행하여 친구에게 초대를 보냅니다.
- Xbox 표준 타이틀 호출 가능 UI(TCUI)를 표시함
- 선택한 플레이어에게 직접 초대를 보냄
초대 수락(선택 사항)
초대를 받은 플레이어가 게임 초대를 수락하거나 셸 UI를 통해 친구의 게임에 참가한 경우 프로토콜 활성화 사용을 통해 플레이어의 장치에서 게임이 시작됩니다. 게임이 시작되면 멀티 플레이어 관리자가 프로토콜이 활성화된 이벤트 인수를 사용하여 로비에 연결할 수 있습니다.
초대된 사용자가 XblMultiplayerManagerLobbySessionAddLocalUser를 통해 추가되지 않으면 XblMultiplayerManagerJoinLobby가 실패하고 JoinLobbyCompleted
이벤트와 함께 XblMultiplayerEventArgsXuid를 호출하여 초대가 전송된 xuid를 제공합니다.
로비에 참가한 후 로컬 구성원의 연결 주소와 구성원의 사용자 지정 속성을 설정하는 것이 좋습니다. 호스트가 없는 경우 XblMultiplayerManagerLobbySessionSetSynchronizedHost를 통해 호스트를 설정할 수도 있습니다.
마지막으로 멀티 플레이어 관리자는 게임이 이미 진행 중이고 초대 대상자를 위한 공간이 있는 경우 자동으로 사용자를 게임 세션에 참가시킵니다.
타이틀은 적절한 오류 코드와 메시지를 제공하는 JoinGameCompleted
이벤트를 통해 알립니다.
오류 또는 성공 결과는 JoinLobbyCompleted
이벤트를 통해 처리됩니다.
플랫 C API
HRESULT hr = XblMultiplayerManagerJoinLobby(inviteHandleId, xblUserHandle);
if (!SUCCEEDED(hr))
{
// Handle failure.
}
// Set member connection address.
const char* connectionAddress = "1.1.1.1";
hr = XblMultiplayerManagerLobbySessionSetLocalMemberConnectionAddress(
xblUserHandle, connectionAddress, context);
자세한 내용은 다음을 참조하세요.
멀티 플레이어 관리자는 다음 기능을 수행하여 초대를 수락합니다.
- 실시간 활동 및 멀티 플레이어 구독을 등록합니다.
- 로비 세션에 참여하세요.
- 기존 로비 상태 정리.
- 모든 로컬 플레이어를 활성 상태로 가입하세요.
- SDA 업로드
- 멤버 속성을 설정합니다.
- 세션 변경 이벤트에 등록하세요.
- 로비 세션을 활성 세션으로 설정합니다.
- 게임 세션에 참가합니다(있는 경우).
- 전송 핸들을 사용합니다.
일치 항목 찾기
초대를 수락하고 호스트에서 게임을 시작할 준비가 되면 SmartMatch를 사용하여 다음 중 한 작업을 수행할 수 있습니다.
- XblMultiplayerManagerFindMatch를 호출하여 로비 세션에 있는 모든 멤버에 대해 비어있는 플레이어 슬롯이 충분한 기존 게임을 찾습니다.
- 로비 세션의 모든 멤버를 포함하는 새 게임 세션을 만들고 XblMultiplayerManagerJoinGameFromLobby를 호출한 다음 XblMultiplayerManagerAutoFillMembersDuringMatchmaking를 호출하여 같은 게임 유형의 매치를 찾고 있는 다른 플레이어들로 빈 스폿을 채웁니다.
XblMultiplayerManagerFindMatch를 호출하기 전, 먼저 서비스 구성에서 호퍼를 구성해야 합니다. 호퍼는 SmartMatch에서 플레이어를 매치시키는 데 사용되는 규칙을 정의합니다.
플랫 C API
uint32_t timeoutInSeconds = 30;
HRESULT hr = XblMultiplayerManagerFindMatch(hopperName, attributesJson, timeoutInSeconds);
if (!SUCCEEDED(hr))
{
// Handle failure.
}
자세한 내용은 XblMultiplayerManagerFindMatch를 참조하세요.
멀티 플레이어 관리자는 다음 함수를 수행하여 매치를 찾습니다.
- 매치 티켓을 만듭니다.
- 모든 서비스 품질(QoS)을 처리합니다.
- 로스터 변경을 처리합니다.
- 다시 제출합니다(필요한 경우).
- 대상 게임 세션에 참가합니다.
- 로비 세션을 통해 게임을 알립니다.