> ## 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.

# クイックスタート Linux

> Ubuntu または WSL 上の Linux プロジェクトに PlayFab Services C SDK を追加し、ネイティブ C クライアントライブラリを使用して最初の PlayFab API 呼び出しを行います。

# クイックスタート: Linux

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

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

## 要件

* [PlayFab 開発者アカウント](https://developer.playfab.com)。
* Ubuntu 22.04 以上、または Ubuntu 22.04 ディストリビューション以上を搭載した Windows Subsystem for Linux。[How to install Linux on Windows with WSL](https://learn.microsoft.com/en-us/windows/wsl/install) を参照してください。他の Linux ディストリビューションでも動作するはずですが、検証されていません。

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

[PlayFab SDK リリースページ](https://github.com/PlayFab/PlayFabCSdk/releases/latest)から PlayFab Linux SDK をプロジェクトにダウンロードします。

### PlayFab C SDK を独自のプロジェクトに統合する

#### バイナリをゲームに追加する

共有オブジェクトファイル (.so) をプロジェクトに統合する必要があります。バイナリを自分でビルドするか、リリースページからダウンロードできます。

以下の手順は、新しいプロジェクトを作成したことを前提として書かれています。

#### .so ファイルの追加

これらのファイルは CMake を使用してプロジェクトに統合されます。

1. Linux 用 PlayFab SDK リリースを解凍し、その内容を目的のディレクトリに配置します。

2. **target\_include\_directories** または同等の関数を使用して、PlayFab SDK リリースからこのヘッダーのリストを追加します:

例:

```cmake theme={null}
target_include_directories(
    [YOUR PROJECT NAME]
    "[LOCATION OF PLAYFAB LINUX SDK]/include"
)
```

3. **target\_link\_libraries** または同等の関数を使用して、.so ファイルの場所をプロジェクトにリンクします。

例:

```cmake theme={null}
set(PLAYFAB_SERVICES_PATH "[LOCATION OF PLAYFAB LINUX SDK]/bin/PlayFabServices.Linux.so")
set(PLAYFAB_CORE_PATH "[LOCATION OF PLAYFAB LINUX SDK]/bin/PlayFabCore.Linux.so")
set(LIBHTTPCLIENT_PATH "[LOCATION OF PLAYFAB LINUX SDK]/bin/libHttpClient.Linux.so")

target_link_librariesc(
    [YOUR PROJECT NAME]
    ${PLAYFAB_SERVICES_PATH}
    ${PLAYFAB_CORE_PATH}
    ${LIBHTTPCLIENT_PATH}
)
```

これで、Linux 用 PlayFab Services SDK を使用するようにプロジェクトが完全にセットアップされました。次の手順に従って、いくつかのサンプル呼び出しを動作させます。

## 初期化とログイン

### ヘッダー

含まれるすべての 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);
```

### ログイン

TBD

**PFServiceConfigHandle** を取得したら、それを使用してプレイヤーのログイン呼び出しを行うことができます。SDK では、**PFAuthenticationLoginWithCustomIDAsync** のような **PFAuthenticationLoginWith\*Async** メソッドを使用します。この関数を使用すると、カスタム ID を使用してプレイヤーを PlayFab にログインさせることができます。

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

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

```cpp theme={null}
    PFAuthenticationLoginWithCustomIDRequest request{};
    request.createAccount = true;
    request.customId = "player1";

    XAsyncBlock async{};
    HRESULT hr = PFAuthenticationLoginWithCustomIDAsync(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 = PFAuthenticationLoginWithCustomIDGetResultSize(&async, &bufferSize);
    loginResultBuffer.resize(bufferSize);

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

## サービス呼び出し

プレイヤーをログインさせた後、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 パターン

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

- [Linux 向け C++ クイックスタート](/ja-jp/services/playfab/sdks/playfab-cpp/quickstart-linux.md)
- [PlayFab がサポートする言語](/ja-jp/services/playfab/sdks/languages/index.md)
- [PlayFab Party SDKs](/ja-jp/services/playfab/multiplayer/networking/party-sdks/overview.md)
- [クイックスタート](/ja-jp/services/playfab/economy-monetization/economy-v2/quickstart.md)
- [クイックスタート iOS](/ja-jp/services/playfab/sdks/c/quickstart-ios.md)
