다음을 통해 공유


로비 SDK 빠른 시작

이 문서에서는 Azure PlayFab Lobby용 개발 환경을 설정하고 PlayFab Multiplayer C/C++ SDK를 사용하여 첫 번째 로비를 만드는 방법을 설명합니다.

참고 항목

PlayFab 멀티 플레이어 SDK는 PlayFab 매치 메이킹을 위한 API도 제공합니다.

필수 구성 요소

PlayFab 로비를 사용하려면 PlayFab 계정이 필요합니다. 계정을 만드는 방법은 빠른 시작: 게임 관리자를 참조하세요.

PlayFab 멀티 플레이어 SDK 다운로드 및 설정

플랫폼용 C/C++ SDK를 다운로드하고 제공자 헤더와 라이브러리 파일을 빌드에 통합합니다.

참고 항목

이 빠른 시작은 C/C++ SDK 사용에 중점을 둡니다. Unity 및 Unreal 인터페이스에 대해서는 다음 문서를 참조하세요.

PlayFab 엔터티에 로그인

PlayFab Lobby SDK를 사용하려면 PlayFab 엔터티 키 및 엔터티 토큰을 사용하여 클라이언트를 인증해야 합니다. LoginWithCustomId REST API로 로그인하여 PlayFab 엔터티 키와 토큰 쌍을 획득합니다. 이 API는 PlayFab REST SDK를 통해 C/C++ 프로젝션으로도 사용할 수 있습니다.

참고 항목

LoginWithCustomId는 PlayFab 기능을 시작하는 빠른 방법이지만 함께 제공되는 로그인 메커니즘은 아닙니다. 로그인 지침은 로그인 기본 사항 및 모범 사례를 참조하세요.

PlayFab 멀티 플레이어 SDK 초기화

다음 기본 단계에 따라 PlayFab Multiplayer SDK를 초기화합니다.

  1. PFMultiplayerInitialize를 호출하여 SDK를 초기화합니다.
  2. PFMultiplayerSetEntityToken을 호출하여 플레이어 대신 라이브러리에서 사용하는 엔터티 키와 토큰을 설정합니다.
static PFMultiplayerHandle g_pfmHandle = nullptr;
...
...
HRESULT hr = S_OK;

// Initialize the PFMultiplayer library.
hr = PFMultiplayerInitialize(titleId, &g_pfmHandle);
if (FAILED(hr))
{
    // handle initialize failure
    printf("PFMultiplayerInitialize failed! %s\n", PFMultiplayerGetErrorMessage(hr));
    return hr;
}

// Set an entity token for a local user. The token is used to authenticate PlayFab operations on behalf of this user. 
// Tokens can expire, and this API token should be called again when this token is refreshed.
hr = PFMultiplayerSetEntityToken(g_pfmHandle, localUserEntity, entityToken);
if (FAILED(hr))
{
    // handle set entity token failure
    printf("PFMultiplayerSetEntityToken failed! %s\n", PFMultiplayerGetErrorMessage(hr));
    return hr;
}

로비 만들기

마지막으로 다음 기본 단계에 따라 로비를 만듭니다.

  1. PFMultiplayerCreateAndJoinLobby를 호출합니다.
  2. PFLobbyCreateAndJoinLobbyCompletedStateChange에 대해 PFMultiplayerStartProcessingLobbyStateChanges를 주기적으로 폴링하여 비동기 완료를 확인합니다.
PFLobbyCreateConfiguration lobbyConfiguration{};
lobbyConfiguration.maxMemberCount = 16;
lobbyConfiguration.ownerMigrationPolicy = PFLobbyOwnerMigrationPolicy::Automatic;
lobbyConfiguration.accessPolicy = PFLobbyAccessPolicy::Public;

PFLobbyJoinConfiguration memberConfiguration{};

PFLobbyHandle lobby;
HRESULT hr = PFMultiplayerCreateAndJoinLobby(g_pfmHandle, localUserEntity, &lobbyConfiguration, &memberConfiguration, nullptr, &lobby);
if (FAILED(hr))
{
    // handle immediate create failure
    printf("PFMultiplayerCreateAndJoinLobby failed! %s\n", PFMultiplayerGetErrorMessage(hr));
    return hr;
}

// NOTE: to simplify this quickstart, we'll synchronously block waiting waiting for the CreateAndJoinLobby operation
// to finish. In a real implementation, this polling would be done asynchronously on a background thread/worker.
bool createAndJoinLobbyFinished = false;
while (!createAndJoinLobbyFinished)
{
    uint32_t lobbyStateChangeCount;
    const PFLobbyStateChange * const * lobbyStateChanges;
    HRESULT hr = PFMultiplayerStartProcessingLobbyStateChanges(m_pfmHandle, &lobbyStateChangeCount, &lobbyStateChanges);
    if (FAILED(hr))
    {
        // handle the failure
        printf("PFMultiplayerStartProcessingLobbyStateChanges failed! %s\n", PFMultiplayerGetErrorMessage(hr));
        return hr;
    }

    for (uint32_t i = 0; i < lobbyStateChangeCount; ++i)
    {
        const PFLobbyStateChange* stateChange = lobbyStateChanges[i];
        switch (stateChange->stateChangeType)
        {
            case PFLobbyStateChangeType::CreateAndJoinLobbyCompleted:
            {
                auto createAndJoinStateChange = 
                    static_cast<const PFLobbyCreateAndJoinLobbyCompletedStateChange*>(stateChange);

                if (SUCCEEDED(createAndJoinStateChange->result))
                {
                    // lobby successfully created!
                    printf("Lobby 0x%p successfully created!\n", createAndJoinStateChange->lobby);
                }
                else
                {
                    // report asynchronous failure
                    printf("Failed to create lobby 0x%p! %s\n",
                        createAndJoinStateChange->lobby,
                        PFMultiplayerGetErrorMessage(createAndJoinStateChange->result));
                }
                createAndJoinLobbyFinished = true;
                break;
            }
        }
    }

    hr = PFMultiplayerFinishProcessingLobbyStateChanges(m_pfmHandle, lobbyStateChangeCount, lobbyStateChanges);
    if (FAILED(hr))
    {
        printf("PFMultiplayerFinishProcessingLobbyStateChanges failed! %s\n", PFMultiplayerGetErrorMessage(hr));
        return hr;
    }
}

로비를 만드는 방법에 대한 자세한 내용은 로비 만들기를 참조하세요.

비동기 작업 처리에 대한 자세한 내용은 비동기 작업 및 알림을 참조 하세요.

다음 단계

참고 항목