다음을 통해 공유


멀티 플레이어 관리자를 사용하여 친구와 멀티 플레이어 게임을 할 수 있습니다.

간단한 멀티 플레이어 시나리오에서 게임의 플레이어는 친구들과 온라인으로 플레이할 수 있습니다. 이 항목에서는 멀티 플레이어 관리자를 사용하여 이 시나리오를 지원하기 위해 구현해야하는 기본 단계에 대해 설명합니다.

초대를 보내고 수락하는 단계

다음 단계에서는 멀티 플레이어 관리자를 사용하여 사용자의 친구가 진행 중인 게임에 참가할 수 있도록 해당 친구에게 초대를 보냅니다.

  1. 멀티 플레이어 관리자 초기화
  2. 로컬 사용자를 추가하여 로비 세션 생성
  3. 친구에게 초대 보내기
  4. 초대 수락
  5. 로비에서 게임 세션 참가

1, 2, 3 및 5단계는 초대를 수행하는 장치에서 이루어집니다. 4단계는 일반적으로 초대 대상자의 디바이스에서 시작되며, 프로토콜 활성화를 통한 앱 실행 이후 개시됩니다.

자세한 내용은 친구와 게임 플레이(순서도)를 참조하세요.

멀티 플레이어 관리자 초기화

로비 세션 개체는 멀티 플레이어 관리자가 유효한 세션 템플릿 이름으로 초기화될 때 자동으로 생성됩니다. 세션 템플릿은 서비스 구성에 정의됩니다.

참고 항목

사용자가 추가될 때까지 서비스의 로비 세션 인스턴스가 만들어지지 않습니다.

플랫 C API

HRESULT hr = XblMultiplayerManagerInitialize(lobbySessionTemplateName, queueUsedByMultiplayerManager);

자세한 내용은 XblMultiplayerManagerInitialize 를 참조하세요.

이 항목의 맨 위쪽으로 돌아갑니다.

로컬 사용자를 추가하여 로비 세션 생성

로컬로 로그인한 Xbox 서비스 사용자를 로비 세션에 추가합니다. 첫 번째 사용자가 추가될 때 새 로비를 호스트합니다. 다른 모든 사용자는 기존 로비에 보조 사용자로 추가됩니다.

멀티 플레이어 관리자는 참가할 친구들을 위해 셸의 로비를 홍보합니다. 로컬 사용자를 추가한 후에만 lobby()을(를) 통해 초대를 전송하고, 로비 속성을 설정하고, 로비 멤버에 액세스할 수 있습니다.

로컬 사용자가 로비에 참가할 때 연결 주소와 사용자 지정 속성을 설정하는 것이 좋습니다.

로컬 방식으로 로그인한 모든 사용자에 대해 이 프로세스를 반복해야 합니다.

이 항목의 맨 위쪽으로 돌아갑니다.

단일 로컬 사용자 추가

플랫 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.
}
...

자세한 내용은 다음을 참조하세요.

이 항목의 맨 위쪽으로 돌아갑니다.

다중 로컬 사용자 추가

플랫 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);
    ...
}

자세한 내용은 다음을 참조하세요.

변경 사항은 다음 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를 통해 친구의 게임에 참가한 경우 플레이어의 장치에서 게임이 시작됩니다.

Microsoft GDK(게임 개발 키트) 기반 게임에서 게임이 시작된 후 XGameInviteRegisterForEvent를 호출하여 초대 이벤트를 수신 대기합니다.

Xbox One 소프트웨어 개발 키트 및 UWP(유니버설 Windows 플랫폼) 기반 게임에서 게임이 시작된 후, 멀티 플레이어 관리자는 프로토콜 활성화 이벤트 인수를 사용하여 로비에 참가할 수 있습니다.

초대된 사용자가 XblMultiplayerManagerLobbySessionAddLocalUser를 통해 추가되지 않은 경우, XblMultiplayerManagerJoinLobby가 실패하고 JoinLobbyCompleted 이벤트로 XblMultiplayerEventArgsXuid를 호출하여 초대가 전송된 xuid를 제공합니다.

로비에 참가한 후 로컬 구성원의 연결 주소와 구성원의 사용자 지정 속성을 설정하는 것이 좋습니다. 호스트가 없는 경우 XblMultiplayerManagerLobbySessionSetSynchronizedHost를 통해 호스트를 설정할 수도 있습니다.

마지막으로, 멀티 플레이어 관리자는 게임이 이미 진행 중이고 초대받은 사람을 위한 공간이 있는 경우 사용자를 게임 세션에 자동으로 참여시킵니다. 타이틀은 적절한 오류 코드와 메시지를 제공하는 JoinGameCompleted 이벤트를 통해 알립니다.

오류 또는 성공 결과는 JoinLobbyCompleted 이벤트를 통해 처리됩니다.

플랫 C API


void CALLBACK MyXGameInviteEventCallback(
    _In_opt_ void* context,
    _In_ const char* inviteUri)
{
    UNREFERENCED_PARAMETER(context);
    if (inviteUri != nullptr)
    {
        std::string inviteString(inviteUri);
        auto pos = inviteString.find("handle=");
        auto inviteHandleId = inviteString.substr(pos + 7, 36);

        // Now use inviteHandleId when calling XblMultiplayerManagerJoinLobby().  
        // See the example call as follows.
    }
}

XTaskQueueRegistrationToken token = { 0 };
HRESULT hr = XGameInviteRegisterForEvent(
    queue,
    nullptr,
    MyXGameInviteEventCallback,
    &token);

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를 업로드합니다.
  • 멤버 속성을 설정합니다.
  • 세션 변경 이벤트에 등록하세요.
  • 로비 세션을 활성 세션으로 설정합니다.
  • 게임 세션에 참여합니다(존재하는 경우).
  • 전송 핸들을 사용하세요.

이 항목의 맨 위쪽으로 돌아갑니다.

로비에서 게임 세션 참가

초대가 받아들여지고 호스트에서 게임 플레이를 시작할 준비가 되면 XblMultiplayerManagerJoinGameFromLobby를 호출하여 로비 세션의 멤버가 포함된 새 게임을 시작할 수 있습니다.

오류 또는 성공 결과는 JoinGameCompleted 이벤트를 통해 처리됩니다.

플랫 C API

HRESULT hr = XblMultiplayerManagerJoinGameFromLobby(gameSessionTemplateName);
if (!SUCCEEDED(hr))
{
    // Handle error.
}

자세한 내용은 XblMultiplayerManagerJoinGameFromLobby를 참조하세요.

멀티 플레이어 관리자는 로비에서 게임 세션에 참가하기 위해 다음 기능을 수행합니다.

  • 게임 세션을 만듭니다.
  • 모든 로컬 플레이어를 활성 상태로 가입하세요.
  • SDA를 업로드합니다.
  • 멤버 속성을 설정합니다.
  • 세션 변경 이벤트에 등록하세요.
  • 로비 세션을 통해 게임을 알립니다.

이 항목의 맨 위쪽으로 돌아갑니다.