Lobby SDK のクイック スタート

この記事では、Azure PlayFab ロビーの開発環境をセットアップし、PlayFab マルチプレイヤー C/C++ SDK を使用して最初のロビーを作成する方法について説明します。

注意

PlayFab マルチプレイヤー SDK は、PlayFab マッチメイキング用の API も提供します。

前提条件

PlayFab ロビーを使用するには、PlayFab アカウントが必要です。 アカウントを作成する手順については、「クイック スタート: ゲーム マネージャー」を参照してください。

PlayFab マルチプレイヤー SDK をダウンロードして設定する

プラットフォーム用の C/C++ SDK をダウンロードし、プロバイダー ヘッダーとライブラリ ファイルをビルドに統合します。

注意

このクイック スタートでは、C/C++ SDK の使用に焦点を当てます。 Unity と Unreal のインターフェイスについては、次の記事を参照してください。

PlayFab エンティティにログインする

PlayFab ロビー SDK を使用するには、PlayFab エンティティ キーとエンティティ トークンを使用してクライアントを認証する必要があります。 LoginWithCustomId REST API を使用してログインすることで、PlayFab エンティティ キーとエンティティ トークンのペアを取得します。 この API は、PlayFab REST SDK を介して C/C++ プロジェクションとしても使用できます。

注意

LoginWithCustomId は、PlayFab 機能を簡単に使い始める方法ですが、付属のログイン メカニズムを意図したものではありません。 ログイン ガイダンスについては、「ログインの基本とベスト プラクティス」を参照してください。

PlayFab マルチプレイヤー SDK を初期化する

次の基本的な手順に従って、PlayFab マルチプレイヤー 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. PFMultiplayerStartProcessingLobbyStateChanges を定期的にポーリングして、PFLobbyCreateAndJoinLobbyCompletedStateChange を確認し、非同期完了を確認します。
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;
    }
}

ロビーの作成の詳細については、ロビーの作成を参照してください。

非同期操作の処理の詳細については、非同期操作と通知を参照してください。

次の手順

関連項目