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

# 共有グループ データの使用

> PlayFab の共有グループ データを CloudScript と組み合わせて使用し、ターン制のゲーム状態や小規模なパーティ データを保存し、グループ メンバーの読み取り/書き込み権限を管理します。

共有グループ データ (Shared Group Data) は、プレイヤーが厳しく制限された他のプレイヤーのリストと情報を共有するためのシンプルな手段です。

<Note>
  共有グループ データは、ほとんどのケースでサーバー権限型で運用されることを想定して設計されており、以前のガイダンスでは、プレイヤーに読み取り/書き込み権限を与えることになる (不正行為の余地が生まれる) ため、プレイヤーを直接共有グループ データに追加*しない*ことが推奨されていました。しかし、新しい [API アクセス ポリシー](/services/playfab/api-references/api-access-policy) により、元の設計と比べて機能とセキュリティに大幅な柔軟性が生まれています。詳細については、このドキュメントの詳細セクションを参照してください。
</Note>

<Warning>
  共有グループ データは、多くとも 10 数人程度より大きなグループでは使用しないでください。1 つの問題として、多数のプレイヤーが同時に同じデータを読み取ろうとすると、データの読み取りに遅延が生じます (共有グループ データは、タイトル データのように多数のプレイヤーが同時に読み取ることを想定したデータのように*シャーディング*も*キャッシュ*もされません)。また、プレイヤーが互いのデータを上書きしないように特に注意が必要です。複数のプレイヤーが同時に同じキーに書き込もうとした場合、そのうちの 1 つの書き込みのみが「勝ち」となり、他のユーザーのデータは失われます。
</Warning>

## 例: ターン制マルチプレイヤーの非同期ゲーム

共有グループ データの元来の、そして今でも最良の使用例は、オンライン ボード ゲームの状態を保存するものとして最もよく表現できます。プレイヤーは明確なターン順序で、CloudScript 経由でデータを変更する形で交代しながらプレイします。

プレイヤーはログオフして後でプレイを再開でき、ゲーム状態はクラウドに保存されます。

以下の CloudScript 例は、一般的なボード ゲーム向けのターン制構造です。ボード ゲーム自体は疑似コードとしてスタブ化されています。

### 前提

このゲームを表す共有グループ データはすでに開始されており、そのメンバーシップもすでに定義されているものとします。

```javascript theme={null}
// CloudScript/Javascript
const MY_GAME_GROUP_KEYS: Array<string> = ["gameState", "currentPlayerTurn"];
interface PlayerTurnArgs {
    sharedGroupId: string;
    nextPlayerTurn: string;
    turnData: any;
}
handlers.TakePlayerTurn = function (args: PlayerTurnArgs) {
    var getRequest: PlayFabServerModels.GetSharedGroupDataRequest = { SharedGroupId: args.sharedGroupId, GetMembers: true, Keys: MY_GAME_GROUP_KEYS };
    var gameData: PlayFabServerModels.GetSharedGroupDataResult = server.GetSharedGroupData(getRequest);
    CheckValidPlayer(currentPlayerId, args.sharedGroupId, gameData.Members, gameData.Data["currentPlayerTurn"].Value, args.nextPlayerTurn);
    var newGameStateJson = UpdateGameState(args.turnData, gameData.Data["gameState"].Value);
    var updateRequest: PlayFabServerModels.UpdateSharedGroupDataRequest = {
        SharedGroupId: args.sharedGroupId,
        Data: {
            "gameState": newGameStateJson,
            "currentPlayerTurn": args.nextPlayerTurn
        }
    };
    server.UpdateSharedGroupData(updateRequest);
}
function CheckValidPlayer(playFabId: string, sharedGroupId: string, members: Array<string>, currentPlayerTurn: string, nextPlayerTurn: string): void {
    var validCurPlayer = false;
    var validNextPlayer = false;
    for (var m = 0; m < members.length; m++) {
        if (members[m] === playFabId)
            validCurPlayer = true;
        if (members[m] === nextPlayerTurn)
            validNextPlayer = true;
    }
    if (!validCurPlayer || !validNextPlayer) // Take extreme action against a player trying to cheat
    {
        server.BanUsers({ Bans: [{ PlayFabId: playFabId, Reason: "Trying to play a game you don't belong to: " + sharedGroupId }] });
        throw "You have been banned";
    }

    if (playFabId !== currentPlayerTurn)
        // May wish to additionally implement a spam-counter here and potentially take more extreme action for high-spam count
        throw "Not your turn";
}
function UpdateGameState(turnData: any, currentState: string): string {
    // PSEUDO-CODE-STUB: Update the turn-based game state according to the rules of this game
    return JSON.stringify({});
}
```

高レベルでは、前述のとおりグループ サイズが比較的小さい限り、共有グループ データを使用してパーティ/レイド、あるいは他の半永久的なプレイヤー グループを実装できます。

現在のところ厳密に強制される制限はありませんが、多数のプレイヤーでの利用はサポートされておらず、極端な場合には、サービス内の他ユーザーへの影響を防ぐために当該タイトル機能がスロットリングされる可能性があります。

### 重要な制限

* **共有グループ データ**:
  * 単純なキー/値ペア データ (文字列) のみを含みます。他のデータ型 (インベントリ アイテム、統計、仮想通貨など) として使用する場合、必要な変換はすべてタイトル側で行う必要があります。
  * *シャーディング*も*キャッシュ*もされないため、複数のプレイヤーから同時にアクセスされた場合、応答性は良くありません。共有グループ データを使う機能は、小規模なプレイヤー グループを想定して設計し、同時書き込みが発生しないようにする必要があります。

### クライアントの権限に関する注意点

グループ内にはロール/ランクのシステムがありません。つまり、グループ内のどのメンバーもグループ内で絶対的な権限を持ちます (定義されたリーダーは存在しません)。

はっきり言えば、これはつまり、[API アクセス ポリシー](/services/playfab/api-references/api-access-policy) を使ってクライアント側の共有グループ データ メソッドを無効化しない限り、クライアントが*データを完全に制御できる*ため、データが悪用される可能性があるということです。

ベスト プラクティスは、共有グループ データをゲームプレイに影響を与えるデータには*使用しない*、もしくはクライアント API 側の共有グループ データ メソッドを無効化することです。


## Related topics

- [XBOX Manager: コンソールとグループの管理](/ja-jp/tools/tools-console/xbom/manager-tool-groups.md)
- [グループ、ギルド、クラン](/ja-jp/services/playfab/community/associations/groups/index.md)
- [パブリッシャー データの使用](/ja-jp/services/playfab/live-service-management/game-configuration/titledata/using-publisher-data.md)
- [エンティティ グループ](/ja-jp/services/playfab/community/associations/groups/quickstart.md)
- [エンティティ オブジェクトを使用してプレイヤー データを保存する](/ja-jp/services/playfab/live-service-management/game-configuration/entities/entity-objects.md)
