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

# Game Saves のオフライン モード

> PlayFab Game Saves のオフライン モードを使用して、接続がなくてもプレイヤーの進行状況を継続させ、ネットワーク回復後にクラウド セーブを同期します。

Game Saves は、オンラインとオフラインの両方で動作するように設計されており、ネットワーク接続が利用できない場合でもプレイヤーがゲームを続けられるようになっています。システムは、ネットワークの可用性とユーザーの選択に基づいて 2 つの異なるモードで動作します。

### 接続モード

#### クラウド接続モード

ネットワークが利用可能で `PFGameSaveFilesAddUserWithUiAsync()` が正常に完了すると、システムはクラウド接続モードで動作します。このモードでは:

* すべての API がクラウド同期を完全に伴って正常に機能します
* セーブ データのアップロードは期待どおりに動作します
* ストレージ クォータの情報が利用可能です
* アクティブ デバイスの監視が正しく機能します

#### オフライン モード (クラウドに未接続)

ネットワークが利用できないか、ユーザーがオフラインでプレイすることを選択した場合、システムは限られた機能でオフライン モードに入ります。`PFGameSaveFilesIsConnectedToCloud()` を使用して現在の接続状態を確認し、システムがどのモードで動作しているかを判断できます。

### 初期同期中のネットワーク障害の処理

`PFGameSaveFilesAddUserWithUiAsync()` がネットワーク接続なしで呼び出されると、`PFGameSaveFilesUiSyncFailedCallback` がトリガーされます。システムがユーザーの応答を待つ間、`XAsyncBlock` コールバックは発火しません。ユーザーが終端アクションを選択するまで、非同期操作は一時停止されます。

```cpp theme={null}
// Handle sync failure callback
void MyPFGameSaveFilesUiSyncFailedCallback(PFLocalUserHandle localUserHandle, PFGameSaveFilesSyncState syncState, HRESULT error, void* context)
{
    // Tell the user something like this:
    std::cout << "We couldn't sync your data with the cloud just now" << std::endl;
    std::cout << "Try syncing again or use this game offline" << std::endl;
    std::cout << "[Try Again]" << std::endl;
    std::cout << "[Use Offline]" << std::endl;

    // if user chooses [Try Again], call PFGameSaveFilesSetUiSyncFailedResponse(localUserHandle, PFGameSaveFilesUiSyncFailedUserAction::Retry);
    // if user chooses [Use Offline], call PFGameSaveFilesSetUiSyncFailedResponse(localUserHandle, PFGameSaveFilesUiSyncFailedUserAction::UseOffline);

    // These API calls can happen inside or outside of this callback
}
```

**ユーザー応答オプション:**

* **Try Again (`Retry`)**: ネットワーク呼び出しを再試行します。再試行も失敗した場合、このコールバックが再度発火し、ユーザーが再度応答する必要があります。`XAsyncBlock` コールバックは、各再試行ループを通じて延期されたままです。
* **Use Offline (`UseOffline`)**: `XAsyncBlock` コールバックが `S_OK` で発火しますが、システムはオフライン モードに入ります (`PFGameSaveFilesIsConnectedToCloud()` で検出できます)。
* **Cancel**: `XAsyncBlock` コールバックが `E_PF_GAMESAVE_USER_CANCELLED` で発火します。

### オフライン モードでの API 動作

オフライン モードでは、API は異なる動作をします。

#### 通常に動作する API

* `PFGameSaveFilesGetFolder()` - ローカル セーブ フォルダー パスを返します

#### 機能が制限される API

* `PFGameSaveFilesUploadWithUiAsync()` - すぐに `S_OK` を返しますが、非同期の完了は `E_PF_GAMESAVE_DISCONNECTED_FROM_CLOUD` を返します
* `PFGameSaveFilesGetRemainingQuota()` - `E_PF_GAMESAVE_DISCONNECTED_FROM_CLOUD` を返します
* `PFGameSaveFilesSetActiveDeviceChangedCallback()` - 設定できますがトリガーされることはありません

#### オンライン モードに戻る

* 再接続を試みるために `PFGameSaveFilesAddUserWithUiAsync()` を再度呼び出します
* Game Saves システムを完全に再初期化する必要はありません
* ネットワークがまだ利用できない場合、再度失敗 UI が表示されます
* 再試行後に接続状態を検証するには `PFGameSaveFilesIsConnectedToCloud()` を使用します

### その他の接続状態シナリオ

`PFGameSaveFilesIsConnectedToCloud()` API は特に有用です。切断は複数の方法で発生する可能性があるためです。

* **同期中のネットワーク利用不可**: ユーザーが明示的にオフラインでのプレイを選択する
* **アクティブ デバイスが変更された**: 別のデバイスがアクティブ デバイスとして引き継ぎ、このデバイスは自動的にオフライン モードになる

適切なユーザー フィードバックを提供するには、クラウド操作を試みる前にこの API を使用してください。

### オフライン サポートのベスト プラクティス

1. ネットワークの問題を優雅に処理するために **常に同期失敗コールバックを実装** する
2. クラウド操作を試みる前に `PFGameSaveFilesIsConnectedToCloud()` を使用して **定期的に接続状態を確認** する
3. セーブが同期されないことをプレイヤーが理解できるように、オフライン モードで動作しているときに **プレイヤーに通知** する
4. ネットワーク接続が復元されたときに **再試行オプションを提供** する
5. **ローカル セーブは常に機能する** - プレイヤーはネットワーク状態に関係なくプレイを続けることができる
6. **切断を監視する** - 別のデバイスがアクティブになるとデバイスが切断される可能性があることを覚えておく

### 接続モードでのアップロード動作

接続モードでも、ネットワークの問題やレート制限によってアップロードが失敗する場合があります。この場合、`XAsyncBlock` コールバックはすぐには発火しません。システムが [UI コールバック ステート マシン](/services/playfab/player-progression/game-saves/ui-callbacks#how-the-state-machine-works) を通じてユーザーの応答を待つ間、非同期操作は一時停止されます。

1. エラーの詳細と共に `PFGameSaveFilesUiSyncFailedCallback` が発火します。
2. `XAsyncBlock` コールバックはまだ発火しません。システムが応答を待つ間、操作が一時停止されます。
3. ユーザーが `Retry` を選択すると、アップロードが再試行されます。再度失敗すると、コールバックが再度発火し、ユーザーが再度応答する必要があります。
4. ユーザーが `Cancel` を選択すると、`XAsyncBlock` コールバックが `E_PF_GAMESAVE_USER_CANCELLED` で発火します。
5. 再試行が成功すると、`XAsyncBlock` コールバックが `S_OK` で発火します。

ゲームは、ネットワークが復元されたら後で `PFGameSaveFilesUploadWithUiAsync()` を再度呼び出すことができます。


## Related topics

- [Game Saves クイックスタート](/ja-jp/services/playfab/player-progression/game-saves/quickstart.md)
- [オフラインプレイの処理に関するベストプラクティス](/ja-jp/services/xbox-services/develop/best-practices/live-best-practices-offline-play.md)
- [XBOX services ユーザー特権のクライアント側での使用](/ja-jp/services/xbox-services/fundamentals/identity/privileges/concepts/live-user-privileges-client.md)
- [Game Saves の同期フローについて](/ja-jp/build/core-features/common/game-save/game-saves-syncing.md)
- [Game Saves システム ダイアログ](/ja-jp/build/core-features/common/game-save/game-saves-dialogues.md)
