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

# クイックスタート (Windows) - PlayFab サービスの呼び出し

> PlayFab Unified SDK の認証済み PFEntityHandle を使用してエンティティキーを取得し、Windows タイトルから PlayFab サービス API を呼び出します。

このガイドでは、Unified SDK を使用して PlayFab サービス API 呼び出しを行う方法を説明します。プレイヤーデータの管理、ファイルの取得、およびその他の PlayFab 機能との対話を行うために、さまざまな PlayFab サービスを呼び出す方法を学びます。

## 前提条件

開始する前に、以下を確認してください:

* [コア SDK のセットアップと認証](/services/playfab/sdks/unified-sdk/quickstart-core)を完了済みであること
* ログインプロセスから取得した認証済みの `PFEntityHandle`
* PlayFab タイトル ID とサービス構成が設定されていること

<Note>
  このガイドでは、[コアクイックスタートガイド](/services/playfab/sdks/unified-sdk/quickstart-core)に従って、既に PlayFab SDK を初期化し、プレイヤーを認証していることを前提としています。まだの場合は、まずそのガイドを完了してください。
</Note>

## 達成すること

このクイックスタートの終わりまでに、以下を達成します:

* 認証済みプレイヤーのエンティティキーを取得する
* 最初の PlayFab サービス API 呼び出しを行う
* PlayFab サービスからのレスポンスを処理する

## 最初のサービス API 呼び出しを行う

認証が成功したら、ログイン中に取得した `PFEntityHandle` を使用して PlayFab API 呼び出しを行うことができます。この例では、現在のプレイヤーに保存されているファイルを取得する方法を示します。

### ステップ 1: エンティティキーを取得する

まず、認証済みエンティティハンドルからエンティティキーを取得します:

```cpp theme={null}
PFEntityKey const* pEntityKey{};
std::vector<char> entityKeyBuffer;
size_t size{};
HRESULT hr = PFEntityGetEntityKeySize(entityHandle, &size);
if (FAILED(hr))
{
    std::wcerr << L"Failed to get entity key size: 0x" << std::hex << hr << std::endl;
    return hr;
}

entityKeyBuffer.resize(size);
hr = PFEntityGetEntityKey(entityHandle, entityKeyBuffer.size(), 
    entityKeyBuffer.data(), &pEntityKey, nullptr);
if (FAILED(hr))
{
    std::wcerr << L"Failed to get entity key: 0x" << std::hex << hr << std::endl;
    return hr;
}

std::wcout << L"Entity ID: " << pEntityKey->id << std::endl;
```

### ステップ 2: GetFiles API を呼び出す

次に、プレイヤーに関連付けられたファイルを取得するために、最初の PlayFab サービス呼び出しを行います:

```cpp theme={null}
// Prepare the request
XAsyncBlock async{};
PFDataGetFilesRequest requestFiles{};
requestFiles.entity = pEntityKey;  // Use the entity key from above

// Make the async API call
HRESULT hr = PFDataGetFilesAsync(entityHandle, &requestFiles, &async);
if (FAILED(hr))
{
    std::wcerr << L"Failed to start GetFiles request: 0x" << std::hex << hr << std::endl;
    return hr;
}

// Wait for the call to complete
hr = XAsyncGetStatus(&async, true);
if (FAILED(hr))
{
    std::wcerr << L"GetFiles request failed: 0x" << std::hex << hr << std::endl;
    return hr;
}

// Get the result size and allocate buffer
size_t resultSize;
hr = PFDataGetFilesGetResultSize(&async, &resultSize);
if (FAILED(hr))
{
    std::wcerr << L"Failed to get result size: 0x" << std::hex << hr << std::endl;
    return hr;
}

// Retrieve the actual result
std::vector<char> getFilesResultBuffer(resultSize);
PFDataGetFilesResponse* getFilesResponseResult{ nullptr };
hr = PFDataGetFilesGetResult(&async, getFilesResultBuffer.size(), 
    getFilesResultBuffer.data(), &getFilesResponseResult, nullptr);
if (SUCCEEDED(hr))
{
    std::wcout << L"Successfully retrieved files. Count: " 
               << (getFilesResponseResult->metadata ? getFilesResponseResult->metadataCount : 0) 
               << std::endl;
    
    // Process the files as needed
    if (getFilesResponseResult->metadata)
    {
        for (uint32_t i = 0; i < getFilesResponseResult->metadataCount; ++i)
        {
            std::wcout << L"File: " << getFilesResponseResult->metadata[i].fileName << std::endl;
        }
    }
}
else
{
    std::wcerr << L"Failed to get GetFiles result: 0x" << std::hex << hr << std::endl;
}
```

🎉 **おめでとうございます!** Unified SDK を使用した最初の PlayFab サービス API 呼び出しに成功しました。

## API 呼び出しのパターンを理解する

すべての PlayFab サービス API 呼び出しは、同様のパターンに従います:

1. **リクエストを準備する** - リクエスト構造体を作成し、値を設定します
2. **非同期呼び出しを開始する** - `*Async` 関数を呼び出します
3. **完了を待つ** - `XAsyncGetStatus` を使用して操作が完了するのを待ちます
4. **結果サイズを取得する** - `*GetResultSize` を呼び出して必要なバッファーサイズを決定します
5. **結果を取得する** - `*GetResult` を呼び出して実際のデータを取得します

このパターンはすべての PlayFab サービス API に適用されるため、基本を理解すればさまざまなサービスを簡単に扱うことができます。

## 次のステップ

PlayFab サービスの呼び出しに成功したので、次はこれらの追加機能を探索しましょう:

### 一般的なサービス API

* **プレイヤーデータ管理** - カスタムプレイヤーデータを保存・取得
* **プレイヤー統計** - プレイヤーの統計と実績を追跡
* **タイトルデータ** - ゲーム構成データにアクセス
* **Cloud Script** - サーバーサイドロジックを実行

### 高度な機能

* **リーダーボード** - ランキング付きの競争機能を実装
* **経済とマネタイゼーション** - 仮想通貨とアイテムを追加
* **マルチプレイヤー** - マッチメイキングとロビーサービスを統合
* **アナリティクス** - プレイヤーの行動とゲーム指標を追跡

### ベストプラクティス

* [非同期操作](/services/playfab/sdks/unified-sdk/async-model) - PlayFab の非同期プログラミングモデルの理解
* [メモリ管理](/services/playfab/sdks/unified-sdk/memory-management) - SDK のメモリ管理のベストプラクティス
* [トレースと診断](/services/playfab/sdks/unified-sdk/debug-trace) - 統合のデバッグと監視

## トラブルシューティング

**一般的な問題と解決策:**

| 問題              | 解決策                                             |
| --------------- | ----------------------------------------------- |
| 無効なエンティティハンドル   | 認証が正常に完了していることを確認してください                         |
| API 呼び出しのタイムアウト | ネットワーク接続と PlayFab サービスの状態を確認してください              |
| アクセス拒否エラー       | タイトル ID とエンティティ権限を確認してください                      |
| バッファーサイズエラー     | 常に `*GetResult` の前に `*GetResultSize` を呼び出してください |

より詳細なエラー情報については、アプリケーションで[トレースと診断](/services/playfab/sdks/unified-sdk/debug-trace)を有効にしてください。

## リファレンスドキュメント

* [PlayFab Unified SDK API リファレンス](/services/playfab/api-references/c/pfauthentication/pfauthentication_members)
* [PlayFab Services API リファレンス](/services/playfab/api-references)
* [PlayFab Data API ドキュメント](https://docs.microsoft.com/gaming/playfab/api-references/data/)


## Related topics

- [Azure Functions を利用した PlayFab CloudScript のクイックスタート ガイド](/ja-jp/services/playfab/live-service-management/service-gateway/automation/cloudscript-af/quickstart.md)
- [Unity クイックスタート](/ja-jp/services/playfab/sdks/unity3d/quickstart.md)
- [クイックスタート (Windows) - Core SDK セットアップ](/ja-jp/services/playfab/sdks/unified-sdk/quickstart-core.md)
- [クイックスタート iOS](/ja-jp/services/playfab/sdks/c/quickstart-ios.md)
- [クイックスタート Linux](/ja-jp/services/playfab/sdks/c/quickstart-linux.md)
