> ## Documentation Index
> Fetch the complete documentation index at: https://devdocs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# クイックスタート GDK

> Microsoft GDK タイトルに PlayFab Services C SDK 拡張ライブラリを追加し、XBOX または Windows GDK コードから最初の PlayFab API 呼び出しを行います。

# クイックスタート: GDK

Microsoft Game Development Kit (GDK) 向けの PlayFab Services SDK を始めましょう。次の手順に従って、ライブラリをプロジェクトに含め、基本的な PlayFab 機能のサンプルコードを試してください。

このクイックスタートは、GDK を使用して最初の PlayFab API 呼び出しを行うのに役立ちます。続行する前に、[クイックスタート: Game Manager](/services/playfab/live-service-management/gamemanager/quickstart) の手順を完了し、PlayFab アカウントを持っており、PlayFab Game Manager に慣れていることを確認してください。

## 要件

* [PlayFab 開発者アカウント](https://developer.playfab.com)。
* [Visual Studio 2019 または 2022](https://visualstudio.microsoft.com/) がインストールされていること。
  * GDK 開発における Visual Studio の要件の詳細については、[SDK とツールの要件](https://learn.microsoft.com/en-us/gaming/gdk/_content/gc/getstarted/overviews/sdk-and-tools#install-visual-studio)を参照してください。

## プロジェクトのセットアップ

他の GDK 拡張ライブラリと同様に、プロジェクトのプロパティを介して PlayFab Services SDK を追加します。プロジェクトの構成プロパティで、**Gaming Desktop** > **General** の下で、**Gaming Extension Libraries** を選択します。プロンプトから、**PlayFab.Services.C** をチェックします。

<img src="https://mintcdn.com/microsoft-4404708b/N3T1ucKV7zIMBudj/images/playfab/sdks/c/gdk1.png?fit=max&auto=format&n=N3T1ucKV7zIMBudj&q=85&s=7fef311a1c51b1ef7ed3c6b651ca7c67" alt="Select PlayFab.Services.C Extension Library" width="624" height="288" data-path="images/playfab/sdks/c/gdk1.png" />

## 初期化とログイン

### ヘッダー

含まれるすべての PlayFab 機能にアクセスするために **PFServices.h** をインクルードします:

```cpp theme={null}
#include <playfab/services/PFServices.h>
```

### 初期化

PlayFab の初期化には、**PFServicesInitialize** と **PFServiceConfigCreateHandle** の 2 つの関数呼び出しが必要です。この初期化の結果は **PFServiceConfigHandle** です。このハンドルを後続のログイン呼び出しに提供して、PlayFab バックエンドの正しいタイトルへの呼び出しを指示します。

```cpp theme={null}
    HRESULT hr = PFServicesInitialize(nullptr); // Add your own error handling when FAILED(hr) == true

    PFServiceConfigHandle serviceConfigHandle{ nullptr };

    hr = PFServiceConfigCreateHandle(
            "https://ABCDEF.playfabapi.com",    // PlayFab API endpoint - obtained in the Game Manager
            "ABCDEF",                           // PlayFab Title id - obtained in the Game Manager
            &serviceConfigHandle);
```

### ログイン

**PFServiceConfigHandle** を取得したら、それを使用してプレイヤーのログイン呼び出しを行うことができます。GDK では、**PFAuthenticationLoginWithXUserAsync** を使用します。この関数を使用すると、**XUserHandle** を使用してプレイヤーを PlayFab にログインさせることができます。**XUserHandle** の取得と管理の詳細については、[User Identity and XUser](/build/core-features/common/user/player-identity-xuser) を参照してください。

ログイン呼び出しを行った後、**XAsyncGetStatus** で呼び出しのステータスを確認できます。ステータスは **E\_PENDING** から始まり、呼び出しが正常に完了すると **S\_OK** に変わります。何らかの理由で呼び出しが失敗した場合、ステータスはその失敗を反映します。すべての PlayFab Services 呼び出しのエラー処理はこのように機能します。

**S\_OK** の結果とともに、**PFEntityHandle** が返されます。このハンドルを使用して、ログインしたプレイヤーとして後続の PlayFab 呼び出しを行います。これには、そのプレイヤーとして PlayFab サービスで認証するために必要なあらゆるマテリアルが含まれています。

```cpp theme={null}
    PFAuthenticationLoginWithXUserRequest request{};
    request.createAccount = true;
    request.user = userHandle; // An XUserHandle obtained from XUserAddAsync

    XAsyncBlock async{};
    HRESULT hr = PFAuthenticationLoginWithXUserAsync(serviceConfigHandle, &request, &async); // Add your own error handling when FAILED(hr) == true
    hr = XAsyncGetStatus(&async, true); // This is doing a blocking wait for completion, but you can use the XAsyncBlock to set a callback instead for async style usage

    std::vector<char> loginResultBuffer;
    PFAuthenticationLoginResult const* loginResult;
    size_t bufferSize;
    hr = PFAuthenticationLoginWithXUserGetResultSize(&async, &bufferSize);
    loginResultBuffer.resize(bufferSize);

    PFEntityHandle entityHandle{ nullptr };
    hr = PFAuthenticationLoginWithXUserGetResult(&async, &entityHandle, loginResultBuffer.size(), loginResultBuffer.data(), &loginResult, nullptr);
```

## サスペンドとレジュームの処理

GDK ゲームは長時間にわたってサスペンドされることがあります (たとえば、Quick Resume 経由で)。サスペンド中にエンティティトークンが期限切れになると、SDK はレジューム時にこれを検出し、ゲームに通知します。必要なときに再認証してサービスに再接続できるように、ゲームのライフサイクルの初期段階で **TokenExpiredHandler** に登録する必要があります。

詳細については、[トークン期限切れの処理](/services/playfab/sdks/c/relogin)を参照してください。

## サービス呼び出し

プレイヤーをログインさせた後、PlayFab バックエンドへの呼び出しを行えます。現在のプレイヤーの PlayFab に保存されたファイルを取得する呼び出しの例を次に示します。

### EntityKey の取得

PlayFab への一部の呼び出しに役立つのは、プレイヤーの **PFEntityKey** を知ることです。**PFEntityToken** を取得したら、**PFEntityGetEntityKey** で **PFEntityKey** を取得できます。

```cpp theme={null}
    PFEntityKey const* pEntityKey{};
    std::vector<char> entityKeyBuffer;
    size_t size{};
    HRESULT hr = PFEntityGetEntityKeySize(entityHandle, &size); // Add your own error handling when FAILED(hr) == true

    entityKeyBuffer.resize(size);
    hr = PFEntityGetEntityKey(entityHandle, entityKeyBuffer.size(), entityKeyBuffer.data(), &pEntityKey, nullptr);
```

### GetFiles の呼び出し

すべての PlayFab 呼び出しは、リクエストオブジェクトを準備し、呼び出しを行い (ログインからの **PFEntityHandle** を使用)、レスポンスを受け取るオブジェクトを作成し、次に **GetResult** 関数を呼び出して新しく作成されたコンテナーを埋めるという同様のパターンに従います。

```cpp theme={null}
    XAsyncBlock async{};
    PFDataGetFilesRequest requestFiles{};
    requestFiles.entity = pEntityKey;

    HRESULT hr = PFDataGetFilesAsync(entityHandle, &requestFiles, &async); // Add your own error handling when FAILED(hr) == true
    hr = XAsyncGetStatus(&async, true); // This is doing a blocking wait for completion, but you can use the XAsyncBlock to set a callback instead for async style usage

    size_t resultSize;
    hr = PFDataGetFilesGetResultSize(&async, &resultSize);

    std::vector<char> getFilesResultBuffer(resultSize);
    PFDataGetFilesResponse* getFilesResponseResult{ nullptr };
    hr = PFDataGetFilesGetResult(&async, getFilesResultBuffer.size(), getFilesResultBuffer.data(), &getFilesResponseResult, nullptr);
```

## クリーンアップ

ゲームをシャットダウンする準備ができたときや、その他の理由で PlayFab をクリーンアップする必要があるときは、開いているすべてのハンドルを閉じ、**PFServicesUninitializeAsync** を呼び出すようにします。

```cpp theme={null}
    PFEntityCloseHandle(entityHandle);
    entityHandle = nullptr;

    PFServiceConfigCloseHandle(serviceConfigHandle);
    serviceConfigHandle = nullptr;

    XAsyncBlock async{};
    HRESULT hr = PFServicesUninitializeAsync(&async); // Add your own error handling when FAILED(hr) == true
    hr = XAsyncGetStatus(&async, true); // This is doing a blocking wait for completion, but you can use the XAsyncBlock to set a callback instead for async style usage
```

## 非同期 API パターン

GDK 用 PlayFab Services SDK は、GDK で実装された[非同期プログラミングモデル](https://learn.microsoft.com/en-us/gaming/gdk/_content/gc/system/overviews/async-programming-model)に従います。このプログラミングモデルには、[XAsync ライブラリ](/build/core-features/common/async/async-libraries/async-library-xasync)によって提供されるタスクとタスクキューの使用が含まれます。このモデルは、他の GDK 関数や拡張機能 (XBOX Services API など) と一貫しています。若干の複雑さは導入しますが、非同期操作に対する高度な制御ももたらします。

この例は、**PFDataGetFilesAsync** への非同期呼び出しを行う方法を示しています。

```cpp theme={null}
    auto async = std::make_unique<XAsyncBlock>();
    async->callback = [](XAsyncBlock* async)
    {
        std::unique_ptr<XAsyncBlock> asyncBlockPtr{ async }; // take ownership of XAsyncBlock

        size_t resultSize;
        HRESULT hr = PFDataGetFilesGetResultSize(async, &resultSize);
        if (SUCCEEDED(hr))
        {
            std::vector<char> getFilesResultBuffer(resultSize);
            PFDataGetFilesResponse* getFilesResponseResult{ nullptr };
            PFDataGetFilesGetResult(async, getFilesResultBuffer.size(), getFilesResultBuffer.data(), &getFilesResponseResult, nullptr);
        }
    };

    PFDataGetFilesRequest requestFiles{};
    requestFiles.entity = m_pEntityKey;
    HRESULT hr = PFDataGetFilesAsync(m_entityHandle, &requestFiles, async.get());
    if (SUCCEEDED(hr))
    {
        async.release(); // at this point, the callback will be called so release the unique ptr
    }

```

## エラー処理

完了した **XAsync** 操作は HTTP ステータスコードを返します。エラーステータスコードは、**XAsyncGetStatus()** または **PF\*Get()** API のいずれかを呼び出すときに、**HTTP\_E\_STATUS\_NOT\_FOUND** のような失敗の **HRESULT** として現れます。

サービスから返される詳細なエラーメッセージを確認するには、デバッグに関する次のセクションを参照してください。これらの詳細なエラーメッセージは、開発中に、PlayFab サービスがクライアントからのリクエストにどのように反応するかをよりよく理解するのに役立ちます。

## デバッグ

PlayFab Services SDK の結果を確認し、任意の呼び出しをデバッグする最も簡単な方法は、[デバッグトレース](/services/playfab/sdks/c/tracing)を有効にすることです。デバッグトレースを有効にすると、デバッガー出力ウィンドウで結果を確認し、結果をゲーム独自のログにフックすることができます。

## リファレンス

[API リファレンスドキュメント](/services/playfab/api-references/c/pfauthentication/pfauthentication_members)


## Related topics

- [GDK 向け C/C++ クイックスタート](/ja-jp/services/playfab/sdks/playfab-cpp/quickstart-gdk.md)
- [クイックスタート](/ja-jp/services/playfab/economy-monetization/economy-v2/quickstart.md)
- [クイックスタート iOS](/ja-jp/services/playfab/sdks/c/quickstart-ios.md)
- [クイックスタート Linux](/ja-jp/services/playfab/sdks/c/quickstart-linux.md)
- [クイックスタート Win32](/ja-jp/services/playfab/sdks/c/quickstart-win32.md)
