Lobby SDK のクイック スタート
この記事では、Azure PlayFab ロビーの開発環境をセットアップし、PlayFab マルチプレイヤー C/C++ SDK を使用して最初のロビーを作成する方法について説明します。
注意
PlayFab マルチプレイヤー SDK は、PlayFab マッチメイキング用の API も提供します。
- C++ API の詳細については、「マッチメイキング SDK クイックスタート」をご覧ください。
- Unity API の詳細については、「Unity のクイック スタート」を参照してください
- Unreal API の詳細については、「Unreal のクイック スタート」を参照してください
前提条件
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 を初期化します。
- PFMultiplayerInitialize を呼び出して SDK を初期化する
- 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;
}
ロビーを作成する
最後に、次の基本手順に従ってロビーを作成します。
- PFMultiplayerCreateAndJoinLobby に電話します。
- 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;
}
}
ロビーの作成の詳細については、ロビーの作成を参照してください。
非同期操作の処理の詳細については、非同期操作と通知を参照してください。