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

# XBOX の要件

> チャット、プライバシー、クロスネットワーク プレイ、マルチプレイヤー セッションに関する XBOX 要件 (XR) を満たすために、XBOX コンソールで PlayFab Party を使用する際のベスト プラクティスです。

ゲームが XBOX コンソールを対象とする場合、XBOX Live と対話する際の機能と動作の一貫性を確保するため、一連の要件に準拠する必要があります。この一連の要件は [XBOX Requirements](https://aka.ms/xrs) (略して XR) に記載されています。XR は、PC やその他のプラットフォーム上のゲームで XBOX Live を利用するために必要な [ポリシー](https://learn.microsoft.com/en-us/gaming/gdk/_content/gc/live/get-started/live-xbl-overview) と相互作用し、重複しています。本ドキュメントでは、これらの要件への準拠に役立つ PlayFab Party のベスト プラクティスを説明します。

クイック リファレンスとして、以下の表に PlayFab Party のシナリオと対応する XR を示します。

| シナリオ                                                                                                                                                      | XR                                                                                                                                                                             |
| --------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| [PlayFab Party を XBOX Live ユーザーのチャット設定および権限に合わせる](#aligning-playfab-party-with-an-xbox-live-users-chat-settings-and-privileges)                           | [XR-015](https://developer.microsoft.com/games/xbox/docs/gdk/xr015)、[XR-045](https://developer.microsoft.com/games/xbox/docs/gdk/xr045)                                        |
| [マルチプレイヤー セッション ドキュメントの維持](#maintaining-a-multiplayer-session-document)                                                                                   | [XR-067](https://developer.microsoft.com/games/xbox/docs/gdk/xr067)                                                                                                            |
| [クロスネットワーク ゲーム セッションでプレイヤーを識別する](#identifying-players-in-a-cross-network-game-session)                                                                    | [XR-007](https://developer.microsoft.com/games/xbox/docs/gdk/xr007)                                                                                                            |
| [XBOX Live ユーザーのクロスネットワーク通信権限を尊重する](#respecting-cross-network-communication-permissions-for-xbox-live-users)                                              | [XR-007](https://developer.microsoft.com/games/xbox/docs/gdk/xr007)                                                                                                            |
| [クロスプレイが許可されていない場合に PlayFab Party の招待を使ってネットワークへのアクセスを制限する](#use-playfab-party-invitations-to-restrict-access-to-networks-when-cross-play-is-not-allowed) | [XR-007](https://developer.microsoft.com/games/xbox/docs/gdk/xr007)                                                                                                            |
| [XBOX Live プロファイル設定と同期を保つ](#keeping-in-sync-with-xbox-live-profile-settings)                                                                              | [XR-048](https://developer.microsoft.com/games/xbox/docs/gdk/xr048)                                                                                                            |
| [プラットフォームのマルチプレイヤー参加フローをサポートする](#supporting-platform-multiplayer-join-flows)                                                                              | [XR-064](https://developer.microsoft.com/games/xbox/docs/gdk/xr064)、[XR-124](https://developer.microsoft.com/games/xbox/docs/gdk/console-certification-requirements-and-tests) |
| [フレンド リスト](#friends-lists)                                                                                                                                | [XR-007](https://developer.microsoft.com/games/xbox/docs/gdk/xr007)、[XR-070](https://developer.microsoft.com/games/xbox/docs/gdk/console-certification-requirements-and-tests) |
| [XBOX Live サービスの再試行ポリシーとサービス アクセス制限を遵守する](#honoring-xbox-live-service-retry-policy-and-service-access-limitations)                                        | [XR-074](https://developer.microsoft.com/games/xbox/docs/gdk/xr074)、[XR-132](https://developer.microsoft.com/games/xbox/docs/gdk/xr132)                                        |

## PlayFab Party XBOX Live Helper ライブラリ

PlayFab Party のコア ライブラリとともに、XBOX Live のポリシー、ひいては XR への準拠を支援するために設計された [XBOX Live Helper ライブラリ](/services/playfab/multiplayer/networking/party-xbox-live-guide) を提供しています。この Helper ライブラリの使用は必須ではありませんが、強く推奨され、ベスト プラクティスとされています。本ドキュメントで示す例は、XBOX Live Helper ライブラリの使用を前提としています。

## PlayFab Party を XBOX Live ユーザーのチャット設定および権限に合わせる

PlayFab Party はチャット通信にオプトイン モデルを採用しており、既定では、2 つの [チャット コントロール](/services/playfab/multiplayer/networking/concepts-objects#chat-control) 間のすべての通信を、両参加者が有効にしている通信の集合に制限します。詳細については、[チャット権限とミュート](/services/playfab/community/voice-communications/concepts-chat-permissions-and-muting) のドキュメントを参照してください。

PlayFab Party の [XBOX Live Helper ライブラリ](/services/playfab/multiplayer/networking/party-xbox-live-guide) は、Party セッションで現在通信中の XBOX Live ユーザーの設定および権限に一致するように、どのチャット権限のセットを有効にすべきかを示します。詳細については、[XBOX Live ユーザーのプライバシー設定と権限を尊重する](/services/playfab/multiplayer/networking/party-xbox-live-guide#respecting-an-xbox-live-users-privacy-settings-and-permissions) のドキュメントを参照してください。

PlayFab Party と [XBOX Live Helper ライブラリ](/services/playfab/multiplayer/networking/party-xbox-live-guide) を適切に活用することで、ゲームは [XR-015](https://developer.microsoft.com/games/xbox/docs/gdk/xr015) で規定された要件を完全に満たし、[XR-045](https://developer.microsoft.com/games/xbox/docs/gdk/xr045) で規定された関連する通信要件も満たすことができます。PlayFab Party の対象外のその他の要件については、[XR-045](https://developer.microsoft.com/games/xbox/docs/gdk/xr045) の技術ドキュメントを参照してください。

## マルチプレイヤー セッション ドキュメントの維持

PlayFab Party は XBOX ユーザー ロースターの機能を提供していません。ロースターの維持およびゲーム セッション内のユーザーと Party ネットワーク アクティビティの関連付けについては、ゲーム側で Multiplayer Session Directory サービス (MPSD) を使用する必要があります。PlayFab Party は、リモートの [エンドポイント](/services/playfab/multiplayer/networking/concepts-objects#endpoint) や [チャット コントロール](/services/playfab/multiplayer/networking/concepts-objects#chat-control) が Party [ネットワーク](/services/playfab/multiplayer/networking/concepts-objects#network) に参加・退出するたびに通知します。これらのオブジェクトに関連付けられた PlayFab Entity ID を MPSD ドキュメント内の XBOX ユーザーと突き合わせることで、どの PlayFab Party オブジェクトがゲーム セッション内の XBOX ユーザーを表しているかを判別する必要があります。クロスプレイのシナリオでは、XBOX ユーザーに関連付けられていない PlayFab Entity は、別のマルチプレイヤー エコシステムのユーザーを表す場合があります。

XBOX ユーザーを識別するには、PlayFab Entity ID と XBOX Live ユーザー間のマッピングを構築する必要があります。これを実現するために、セッションの XBOX Live ユーザーのリストを MPSD ドキュメントに保存し、XBOX Live Helper ライブラリを使用してそれらの XBOX Live ユーザーを PlayFab Entity ID に変換することが推奨されます。例については、[XBOX Live ユーザー ID と PlayFab Entity ID 間のマッピング](/services/playfab/multiplayer/networking/party-xbox-live-guide#mapping-between-xbox-live-user-ids-and-playfab-entity-ids) を参照してください。

Party ネットワークのロースターを提供するだけでなく、MPSD ドキュメントは、マッチメイキング、プラットフォーム招待、最近プレイしたプレイヤーのリスト、参加型 (join-in-progress) など、XBOX マルチプレイヤー エコシステムにおける多くのマルチプレイヤー体験の基盤となります。これらの MPSD フローに Party ネットワークを組み込む方法の詳細については、[PlayFab Party を MPSD と共に使用する](/services/playfab/multiplayer/networking/using-mpsd) を参照してください。

詳細については、[MPSD の概要](/services/xbox-services/multiplayer/mpsd/live-mpsd-overview) を参照してください。

<Info>
  このセクションは PlayFab Party を MPSD と一緒に使用する際のベスト プラクティスを提供しますが、PlayFab Party 自体は [XR-067](https://developer.microsoft.com/games/xbox/docs/gdk/xr067) の MPSD 要件を暗黙的に満たすものではありません。これらの要件を満たす方法については、[XR-067](https://developer.microsoft.com/games/xbox/docs/gdk/xr067) の技術ドキュメントを参照してください。
</Info>

## クロスプレイの Party ネットワークで XBOX クライアントを使用する

クロスプレイのシナリオで XBOX Live エコシステムと対話する際は、以下のベスト プラクティスに留意してください。

<Info>
  このセクションは、XBOX Live とのクロスプレイ シナリオで PlayFab Party を使用する際のベスト プラクティスを提供しますが、PlayFab Party の使用は [XR-007](https://developer.microsoft.com/games/xbox/docs/gdk/xr007) のクロスプレイ要件を暗黙的に満たすものではありません。これらの要件を満たす方法については、[XR-007](https://developer.microsoft.com/games/xbox/docs/gdk/xr007) の技術ドキュメントを参照してください。
</Info>

### クロスネットワーク ゲーム セッションでプレイヤーを識別する

一意のプレイヤーは、マルチプレイヤー エコシステム全体で識別可能かつ区別可能である必要があります。このため、PlayFab Party はセッション内のユーザーに関連付けられる可能性のあるさまざまなオブジェクト (`PartyLocalUser`、`PartyEndpoint`、`PartyChatControl`) に PlayFab Entity ID を提供します。

クロスネットワーク表示名は PlayFab Party API では提供されません。UI に XBOX ユーザーを表示する場合は、そのゲーマータグを使用し、ゲーマータグは MPSD ドキュメント内の XBOX ユーザー ID から解決する必要があります。XBOX 以外のユーザーは、[XR-007](https://developer.microsoft.com/games/xbox/docs/gdk/xr007) のガイドラインに基づいて UI に表示する必要があります。プラットフォームから提供される表示名がない場合、PlayFab は [GetPlayerProfile](xref:titleid.playfabapi.com.client.accountmanagement.getplayerprofile) を通じて表示名をサポートします。ネットワークに参加する際は、他のプレイヤーが確認できるようにプレイヤーが自身の表示名を共有セッション ドキュメントに投稿する必要があります。

PlayFab Party ライブラリは、その一部のオブジェクトを PlayFab ユーザー (PlayFab Entity ID 経由) と関連付けますが、ライブラリは PlayFab ユーザーがどのマルチプレイヤー エコシステムに関連付けられているかを識別する機能を提供していません。XBOX Live の PlayFab ユーザーを他のマルチプレイヤー エコシステムのユーザーと区別するには、Party ネットワーク内の PlayFab Entity ID を MPSD と相互参照することを推奨します。MPSD を介した XBOX Live プレイヤーと非 XBOX Live プレイヤーの区別方法の詳細については、[マルチプレイヤー セッション ドキュメントの維持](#maintaining-a-multiplayer-session-document) のセクションを参照してください。

XBOX Live とのクロスプレイ ネットワークにおけるユーザー識別の要件の詳細については、[XR-007](https://developer.microsoft.com/games/xbox/docs/gdk/xr007) を参照してください。

### XBOX Live ユーザーのクロスネットワーク通信権限を尊重する

PlayFab Party は XBOX Live のクロスネットワーク通信制限に暗黙的に準拠するものではありません。そのため、PlayFab Party XBOX Live Helper ライブラリは XBOX Live ユーザーのクロスネットワーク通信権限を問い合わせるための機能を提供します。[XR-007](https://developer.microsoft.com/games/xbox/docs/gdk/xr007) に規定されているクロスネットワーク通信要件に準拠するために、この情報を使用する必要があります。

詳細については、[クロスネットワーク通信を尊重する](/services/playfab/multiplayer/networking/party-xbox-live-guide#respecting-cross-network-communication-permissions) を参照してください。

### クロスプレイが許可されていない場合に PlayFab Party の招待を使ってネットワークへのアクセスを制限する

XBOX Live ユーザーは、クロスネットワーク ゲーム セッションで XBOX Live 以外のユーザーと対話するためには、クロスネットワーク権限が必要です。PlayFab Party はこれらのクロスネットワーク制限 ([XR-007](https://developer.microsoft.com/games/xbox/docs/gdk/xr007) に規定) に暗黙的には準拠しないため、この権限は PlayFab Party ライブラリの外部で問い合わせる必要があります。これらの権限が付与されていない場合、Party ネットワークはゲーム セッションの MPSD ドキュメント内で認識される XBOX Live ユーザーのみを許可するように制限する必要があります。これは、私たちのサンプルの [参加型 (join-in-progress) フロー](/services/playfab/multiplayer/networking/using-mpsd#join-in-progress) を拡張し、既知の XBOX ユーザーのみがネットワークに参加できるようにする Party 招待を使用することで実現できます。

まず、Party ネットワークが制限された招待で作成されるようにします。

```cpp theme={null}
PartyString networkCreatorEntityId;
RETURN_VOID_IF_FAILED(m_localPartyUser->GetEntityId(&networkCreatorEntityId));

PartyInvitationConfiguration newNetworkInitialInvite{};
newNetworkInitialInvite.identifier = nullptr; // let Party select the invitation identifier for simplicity
newNetworkInitialInvite.revocability = PartyInvitationRevocability::Anyone; // the initial invitation must be revocable by anyone

// this initial invitation only allows the original xbl user creating the network
newNetworkInitialInvite.entityIdCount = 1;
newNetworkInitialInvite.entityIds = &networkCreatorEntityId;

PartyError error = PartyManager::GetSingleton().CreateNewNetwork(
    m_localPartyUser,
    &networkConfiguration,
    0,
    nullptr,
    &newNetworkInitialInvite,
    nullptr,
    nullptr,
    nullptr);
```

[参加型 (join-in-progress) フロー](/services/playfab/multiplayer/networking/using-mpsd#join-in-progress) と同様に、新しい XBOX ユーザーがネットワークに参加したい場合、まずセッション ドキュメントに自身を追加します。ネットワークへの参加を許可したいプレイヤーがその更新を確認したら、セッション ドキュメントを反映するように招待のセットを更新します。これにより、セッション ドキュメント内のユーザー (XBOX Live ユーザーであることが保証されます) のみがネットワークに参加できるようになります。

```cpp theme={null}
void
OnSessionDocumentUpdated(
    PartyNetwork* network,
    uint32_t usersInDocumentCount,
    const uint64_t* usersInDocument
    )
{
    PartyInvitationConfiguration newInvite{};
    newInvite.identifier = nullptr; // let Party select the invitation identifier for simplicity
    newInvite.revocability = PartyInvitationRevocability::Creator; // must be revocable by the creator only

    // the updated invite should contain all users currently in the document
    std::vector<PartyString> entityIdsInDocument;
    for (uint32_t i = 0; i < usersInDocumentCount; ++i)
    {
        uint64_t xboxUserId = usersInDocument[i];
        // Call title-defined xuid->entityid mapping helper
        PartyString xboxUserEntityId = GetEntityIdFromXboxUserId(xboxUserId);
        if (xboxUserEntityId != nullptr)
        {
            entityIdsInDocument.push_back(xboxUserEntityId);
        }
        else
        {
            DEBUGLOG("User %llu did not have a matching entity ID.", xboxUserId);
        }
    }
    newInvite.entityIdCount = entityIdsInDocument.size();
    newInvite.entityIds = entityIdsInDocument.data();

    // Create a new invitation which includes all of the users currently in the document
    PartyInvitation* newInvitation;
    PartyError error = network->CreateInvitation(
        m_localUser,
        &newInvite,
        nullptr,
        &newInvitation);
    if (PARTY_FAILED(error))
    {
        DEBUGLOG("PartyNetwork(0x%p)::CreateInvitation failed! (error=0x%x)", network, error);
        return;
    }

    // Post the invitation's id somewhere that it can be seen by anyone trying to join/rejoin
    PostInvitationToMPSD(newInvite);

    // Cleanup previous invitations. This isn't strictly necessary, but is a good practice.
    uint32_t invitationCount;
    PartyInvitationArray invitations;
    error = network->GetInvitations(&invitationCount, &invitations);
    if (PARTY_FAILED(error))
    {
        DEBUGLOG("PartyNetwork(0x%p)::GetInvitations failed! (error=0x%x)", network, error);
        return;
    }

    for (uint32_t i = 0; i < invitationCount; ++i)
    {
        if (invitations[i] == newInvite)
        {
            continue; // don't prune the old invitation
        }

        PartyInvitation* oldInvitation = invitations[i];

        error = network->RevokeInvitation(m_localUser, oldInvitation, nullptr);
        if (PARTY_FAILED(error))
        {
            DEBUGLOG("PartyNetwork(0x%p)::RevokeInvitation failed! (err=0x%x)", network, error);
        }
    }
}
```

<Note>
  XBOX Live ユーザー ID と PlayFab Entity ID の間で変換を行う必要があるため、両者の間のマッピングを構築することが推奨されます。方法の例については、[XBOX Live ユーザー ID と PlayFab Entity ID 間のマッピング](/services/playfab/multiplayer/networking/party-xbox-live-guide#mapping-between-xbox-live-user-ids-and-playfab-entity-ids) を参照してください。
</Note>

## XBOX Live プロファイル設定と同期を保つ

PlayFab Party は既定で [XR-048](https://developer.microsoft.com/games/xbox/docs/gdk/xr048) のプロファイル設定要件に準拠しています。このライブラリは XBOX Live プロファイル設定の永続キャッシュを保持しません。PlayFab Party の用途でプロファイル設定が必要となった場合、その設定は XBOX Live に問い合わされ、その設定に関連付けられた PlayFab Party API オブジェクトの存続期間中は有効ですが、オブジェクトの複数インスタンスをまたいで保持されることはありません。

PlayFab Party 以外での XBOX Live プロファイル設定データの使用については、[XR-048](https://developer.microsoft.com/games/xbox/docs/gdk/xr048) の技術ドキュメントを参照してください。

## プラットフォームのマルチプレイヤー参加フローをサポートする

XBOX では、プレイヤーは参加型 (join-in-progress) 機能やプラットフォーム招待機能を通じてマルチプレイヤー ゲームに参加できます。PlayFab Party はこれらのプラットフォーム機能と直接統合しませんが、`PartyNetworkDescriptor` および `PartyInvitation` オブジェクトを介した利用をサポートします。`PartyNetworkDescriptor` オブジェクトは、リモート ユーザーが Party ネットワークを発見して接続するために必要な接続情報を提供し、`PartyManager::SerializeNetworkDescriptor` によってシリアル化できます。`PartyInvitation` オブジェクトは、リモート ユーザーが Party ネットワークで認証されて参加するために使用する ID を提供します。参加型 (join-in-progress) やプラットフォーム招待経由でリモート ユーザーがマルチプレイヤー ゲームに参加できるようにするには、シリアル化されたネットワーク記述子と Party 招待識別子を既存のフローに統合してください。フローの例は [PlayFab Party を MPSD と共に使用する](/services/playfab/multiplayer/networking/using-mpsd) のドキュメントにも記載されています。

プラットフォームのマルチプレイヤー参加フロー要件の詳細については、[XR-064](https://developer.microsoft.com/games/xbox/docs/gdk/xr064) および [XR-124](https://developer.microsoft.com/games/xbox/docs/gdk/console-certification-requirements-and-tests) の技術ドキュメントを参照してください。

## フレンド リスト

PlayFab Party はどのプラットフォームでもフレンド リストとネイティブに対話しませんが、マルチプレイヤー ゲームでは異なるシナリオでフレンド リストを考慮する必要がある場合があります。XBOX Live およびクロスネットワーク フレンド リストと対話する際の要件およびガイダンスについては、以下のドキュメントを参照してください。

* [XBOX Live フレンド リスト要件 (XR-070)](https://developer.microsoft.com/games/xbox/docs/gdk/console-certification-requirements-and-tests)
* [クロスネットワーク フレンド リスト要件 (XR-007)](https://developer.microsoft.com/games/xbox/docs/gdk/xr007)
* [XBOX Social Manager](https://learn.microsoft.com/en-us/gaming/gdk/_content/gc/live/get-started/live-xbl-overview)
* [XBOX Live Services API (XSAPI)](https://learn.microsoft.com/en-us/gaming/gdk/_content/gc/live/get-started/live-xbl-overview)

## XBOX Live サービスの再試行ポリシーとサービス アクセス制限を遵守する

PlayFab Party は [XBOX Live Helper ライブラリ](/services/playfab/multiplayer/networking/party-xbox-live-guide) を除き、XBOX Live サービスと直接対話しません。XBOX Live Helper ライブラリは、内部的に [XR-074](https://developer.microsoft.com/games/xbox/docs/gdk/xr074) および [XR-132](https://developer.microsoft.com/games/xbox/docs/gdk/xr132) で規定された、関連する XBOX Live サービスの再試行ポリシーおよびアクセス制限に準拠しています。また、これらのサービス ポリシーに準拠した結果としての API 失敗は、XBOX Live Helper ライブラリが報告する以下のエラー コードで認識できます。[PartyXblChatPermissionMaskReason::XboxLiveServiceError](/services/playfab/multiplayer/networking/xblreference/enums/partyxblchatpermissionmaskreason) および [PartyXblStateChangeResult::PartyServiceError](/services/playfab/multiplayer/networking/xblreference/enums/partyxblstatechangeresult)。

XBOX Live Helper ライブラリ以外でこれらのサービス ポリシーに準拠する方法の詳細については、[XR-074](https://developer.microsoft.com/games/xbox/docs/gdk/xr074) および [XR-132](https://developer.microsoft.com/games/xbox/docs/gdk/xr132) の技術ドキュメントを参照してください。


## Related topics

- [XR-003 提出時のタイトル品質](/ja-jp/publishing/certification/xr/xr-003.md)
- [XR-014 プレイヤー データと個人情報](/ja-jp/publishing/certification/xr/xr-014.md)
- [ディスク パッケージの要件](/ja-jp/publishing/game-publishing/publishing-processes/managed-creators/publishing-processes-disc-packaging.md)
- [X-Token または OAuth 2.0 を使用したユーザー Store ID の要求](/ja-jp/publishing/xstore-commerce/xstore-requesting-userstoreid-oauth.md)
- [Azure PlayFab Party](/ja-jp/build/console-features/networking/game-mesh/playfab-party-intro-networking.md)
