Skip to main content
このトピックでは、Multiplayer Session Directory (MPSD) サービスによって、タイトルがユーザーグループを接続するために必要な基本情報を共有できる仕組みについて説明します。 MPSD は、招待の送受信や、ゲーマーカード経由でユーザーが参加する際に、シェルおよびコンソールのオペレーティングシステムと連携します。 MPSD は、複数のクライアント間でゲームのマルチプレイヤーシステムメタデータを一元化します。 MPSD は、セッション機能が同期され一貫していることを保証します。 MPSD は、XBOX services クラウド上で動作するサービスです。 これは XblMultiplayer 関数によってラップされています。 このトピックでは、以下について説明します。

MPSD セッション

MPSD セッションは、その XblMultiplayerSessionHandle によって識別され、1 人以上のユーザーがゲームをプレイするシナリオを表します。 セッションは、MPSD によって XBOX services クラウド内でセキュアな JSON ドキュメントとして保存されます。 具体的には、MPSD セッションは次の特性を持ちます。
  • タイトルによって作成および管理されます。
  • 一意の URI を持ちます。詳細については、Session Directory URIs を参照してください。
  • セッションメンバーと呼ばれるユーザー間の接続を可能にします。
  • メンバーごとの属性、ゲーム設定、ブートストラップ情報、ゲームサーバー情報など、ゲームプレイを可能にするデータを格納します。
すべてのセッションには、プレイヤーの XBOX user identifier (XUID) およびセキュアデバイス関連付けアドレスデータが含まれます。 MPSD は、次のバリエーションを含む、さまざまな種類のマルチプレイヤーゲームをセットアップするためのいくつかの種類のセッションをサポートします。 このトピックの先頭に戻る。

MPSD 変更通知の処理と切断検出

クライアントは、Real-Time Activity (RTA) サービス Web ソケットを使用して MPSD に接続します。 この接続は次の目的で使用されます。
  • タイトルが開始したイベント購読に基づいて、セッション変更が発生したときに簡潔な通知 (ショルダータップ) を送信する。
  • ユーザーの切断を検出する。
  • 切断検出に基づいて、ユーザーを非アクティブに設定してからセッションから削除する。

ユーザー接続を確立する

XBOX Services API (XSAPI) ライブラリは、クライアントと MPSD 間の接続を管理します。
  1. タイトルは XblMultiplayerSetSubscriptionsEnabled を呼び出します。このメソッドは、クライアントがマルチプレイヤー目的で RTA 接続を使用する意図があることを XSAPI に伝えます。
  2. タイトルが現在のユーザーを Active 状態に設定して XblMultiplayerWriteSessionAsync または XblMultiplayerWriteSessionByHandleAsync を最初に呼び出すと、接続が作成され MPSD に接続されます。
セッション通知を有効にし、切断を検出するには、セッションテンプレートで connectionRequiredForActiveMemberstrue に設定する必要があります。

セッション変更を購読する

MPSD は、興味深い何かが変更されたことを示す軽量な通知としてショルダータップを使用します。 購読が有効になっている場合、タイトルは XblMultiplayerSessionSetSessionChangeSubscription の呼び出しでセッション変更に関するショルダータップを購読できます。 詳細については、Multiplayer タスクトピックの MPSD セッション変更通知の購読 セクションを参照してください。

ショルダータップを処理する

セッションへの変更が、そのセッションのタイトルの購読と一致すると、MPSD は XblMultiplayerSessionChangedHandler ハンドラーを使用して変更をタイトルに通知します。 タイトルはその後セッションを取得し、取得したバージョンのセッションを以前にキャッシュされたビューと比較して、適切なアクションを取る必要があります。

接続状態変更の通知を処理する

タイトルは、MPSD への接続の健全性の変化について通知を受けることができます。 これらの変化を通知する 2 つのイベントがあります。
  • XblMultiplayerSessionSubscriptionLostHandler ハンドラー - タイトルの RTA サービスを使用した MPSD への接続が失われたときに発生します。このイベントが発生したときは、タイトルはマルチプレイヤーをシャットダウンする必要があります。
  • XblRealTimeActivityConnectionStateChangeHandler ハンドラー - タイトルの RTA サービスへの接続の健全性の一時的な変化時に発生します。このイベントを受信してもタイトルは何もアクションを取る必要はありませんが、イベントは診断目的で有用な場合があります。

クライアントを切断する

タイトルが XblMultiplayerSetSubscriptionsEnabled の呼び出しで通知を無効にすると、タイトルのクライアントは MPSD から切断されます。 この呼び出しの直後、XblMultiplayerSessionSubscriptionLostHandler ハンドラーが発生し、クライアントが MPSD から切断されたことを示します。
以前のマルチプレイヤーバージョンでは、タイトルは RTA サービスから切断するために XblRealTimeActivityDeactivate を呼び出していました。 2015 Multiplayer サービスでは、このメソッドは効果を持ちません。 切断は、XblMultiplayerSetSubscriptionsEnabledfalse 値で呼び出され、Presence サービスへの RTA サービス購読のような Web ソケット接続のユーザーがいない場合に自動的に発生します。

切断検出

MPSD は、切断検出機能を使用して、ユーザーがぎこちなく切断したことを迅速に検出します。 ぎこちない切断の原因には、プレイヤーのネットワーク障害やタイトルクラッシュがあります。 MPSD は切断されたプレイヤーの状態を Active から Inactive に変更し、メンバーのセッションへの購読に応じて、必要に応じて他のセッションメンバーに変更を通知します。

RTA 再接続を処理する

XSAPI は、切断時に RTA への再接続と RTA 購読の再送信を試みます。(詳細については、RTA サービスのベストプラクティス を参照してください。) マルチプレイヤー RTA 購読を再送信すると、MPSD セッション内のユーザーをクライアント RTA 接続に関連付けるために使用される接続 ID が更新されます。 XSAPI は、XblMultiplayerAddConnectionIdChangedHandler を介して MPSD 接続 ID が変更されたことをタイトルに通知します。コールバック内で、タイトルは新しい接続 ID を MPSD セッションに書き込む必要があります。新しい接続 ID は、XblMultiplayerSessionCurrentUserSetStatus を呼び出し、次に XblMultiplayerWriteSessionAsync を呼び出してセッションに書き込むことで、セッションに書き込むことができます。
このトピックの先頭に戻る。

セッションへの MPSD ハンドル

MPSD セッションハンドルは、セッションへの抽象的で不変な参照であり、追加の型付きデータを含めることもできます。 これはファイルハンドルに似ています。 すべてのハンドルには、ハンドル ID (GUID) と、service configuration ID (SCID)、セッションテンプレート、およびセッション名で構成される完全なセッション参照があります。 ハンドルは更新できませんが、作成、読み取り、削除は可能です。
ハンドルは存在しないセッションを指すことができます。 存在しないセッション名を使用してハンドルを作成しても、新しいセッションは作成されません。

ハンドルタイプ

2015 Multiplayer は、招待ハンドルとアクティビティハンドルをサポートします。

招待ハンドル

招待ハンドルは、特定のユーザーへの招待を表します。 型固有のデータには、送信元ユーザー、対象ユーザー、および招待を説明するコンテキスト文字列 (たとえば、特定のゲームモード) が含まれます。 招待ハンドルは、オープンセッションへの読み取り/書き込みアクセスを付与します。 セッションがクローズされている場合、ハンドルは読み取り専用のセッションアクセスを付与します。
MPSD は、セッションが満員またはクローズされている場合でも招待を作成できます。

招待ハンドルを作成する

招待ハンドルを作成するには、タイトルは XblMultiplayerSendInvitesAsync を呼び出します。 このメソッドは、受信者が招待を受け入れるためにアクションを取ることができる通知で、指定されたユーザーに招待を送信します。

アクティビティハンドルを作成する

アクティビティハンドルを作成するには、タイトルは XblMultiplayerSetActivityAsync を呼び出します。 MPSD は、新しいハンドル ID をセッションメンバーの bound activity として設定します。 以前に bound activity があった場合、MPSD は対応するハンドルを削除します。 アクティブなメンバーが非アクティブになるかセッションから離脱すると、MPSD は bound activity ハンドルを削除します。

ハンドルを使用する

タイトルは、ユーザーが招待を受け入れるとき (招待ハンドル)、およびユーザーがフレンドの現在のアクティビティに参加するとき (アクティビティハンドル) にハンドルを使用します。 これらのいずれの場合でも、タイトルは次のアクションを実行する必要があります。
  1. タイトルアクティベーションパラメーターからハンドル ID を取得します。
  2. ローカル MPSD セッションオブジェクトを作成し、アクティブとして参加します。
  3. 適切なハンドルを渡して、セッションを書き込みます。
このトピックの先頭に戻る。

セッション更新の同期

セッションは、そのメンバーのいずれかによって作成または更新できる共有リソースです。その結果、競合する書き込みが発生する可能性があります。 これは、たとえば 1 つのタイトルが別のタイトルによって行われた変更を上書きするなど、予期しない結果につながる可能性があります。 これらの競合を解決するための MPSD のアプローチは、楽観的並行性と read-modify-write パターンをサポートすることです。 MPSD によるセッション更新の同期は、2 つの関連する高レベルの実装パターンを使用します。
  • arbiter がセッションの共有部分を更新します。実装に単一の arbiter が含まれる場合、ほとんどの書き込み操作で同期された更新の使用を避けることができます。タイトルは次のケースで同期を回避できます。
    • arbiter の ID の通信に関連しない限り、arbiter がセッションの共有部分に対して行うすべての更新
    • タイトルがセッション内のメンバーエリアに対して行うすべての更新
    [!NOTE] 前述の更新タイプは同期を必要としませんが、XblMultiplayerSessionProperties::HostDeviceToken プロパティへの更新は同期することが依然として重要です。 このプロパティは、arbiter の移行の一部として arbiter の ID を通信するために使用されます。
  • すべてのクライアントがセッションの共有部分を更新します。この場合、セッションの共有部分へのすべての更新を同期する必要があります。ただし、タイトルは同期なしで自分自身のメンバーエリアに書き込むことができます。

Multiplayer API を使用したセッション同期の更新

次のマルチプレイヤー API メソッドは、楽観的並行性を実装します。 各 write メソッドは、XblMultiplayerSessionWriteMode 値を受け付けます。 値 SynchronizedUpdate を渡すと、更新に楽観的並行性が使用されます。 列挙内の他の値は、セッションの最初の作成時に発生する可能性のある競合の解決に役立ちます。 別のタイトルによって書き込まれる可能性のある MPSD セッションの部分への書き込みには、同期された更新を使用する必要があります。 ただし、すべての書き込みを保護する必要はありません。 タイトルが write session メソッドの 1 つを使用してローカルセッションオブジェクトを MPSD に書き込もうとすると、HTTP/412 ステータスコードを受信する可能性があります。この場合、書き込みを再度試行する前に XblMultiplayerGetSessionAsync 呼び出しを発行してサーバーの最新バージョンのセッションを取得し、ローカルコピーを更新する必要があります。 そうしないと、ローカルセッションドキュメントに引き続き不正なデータが含まれ、セッションを書き込む呼び出しが引き続き失敗します。
タイトルが write session メソッドの 1 つを呼び出すと、セッションの更新バージョンが返される可能性があります。 セッションの更新バージョンが返された場合、タイトルはローカルのキャッシュコピーをスレッドセーフな方法で新しいバージョンに置き換える必要があります。

Multiplayer REST API を使用したセッション同期の更新

MPSD は、HTTP “if-match” ヘッダーを ETag 設定および read-modify-write パターンで使用することにより、REST 機能によるセッション更新での楽観的並行性をサポートします。 write 要求で渡される ETag は、前の read 要求で MPSD が返したものである必要があります。 このトピックの先頭に戻る。

MPSD の呼び出し

タイトルは、マルチプレイヤーシステムとマッチメーキングを使用するために、次の方法で MPSD にアクセスできます。
  • RESTful 機能のラッパーとして機能するクラスを含むマルチプレイヤー API を使用することをお勧めします。詳細については、XblMultiplayer プレフィックス関数を参照してください。SmartMatch マッチメーキングには、XblMatchmaking プレフィックス関数によって表されるマッチメーキング API を使用します。
  • XBOX services RESTful リファレンス に含まれるマルチプレイヤーとマッチメーキングの REST API への直接的な標準 HTTP 呼び出しを使用します。適用可能な URI は、Session Directory URIs (マルチプレイヤー用) および Matchmaking URIs (マッチメーキング用) セクションに記載されています。関連する JSON オブジェクトは、JavaScript Object Notation (JSON) オブジェクトリファレンスセクションに記載されています。

Multiplayer API を使用して MPSD を呼び出す

XSAPI 内のマルチプレイヤー API およびマッチメーキング API を使用して MPSD を呼び出すことをお勧めします。
例は、マルチプレイヤー API およびマッチメーキング API と XSAPI の他の要素を使用して記述されています。
基礎となる REST 機能のラッパーコードを使用すると、呼び出しごとに HTTP トラフィックを処理する必要なく、クライアント側の API メソッドを使用する従来のアプローチが可能になります。

Multiplayer REST API を使用して MPSD と対話する

タイトルまたはそのサービスは、マルチプレイヤー REST API およびマッチメーキング REST API への標準 HTTP 呼び出しを使用できます。 REST 機能を直接使用する場合、呼び出し元はほとんどのアクションでセッションディレクトリ URI に対して DELETEPUTPOST、および GET 呼び出しを発行します。 PUT 要求では、要求本文が既存のセッションにマージされます。 既存のセッションがない場合、要求本文は Partner Center に保存されているセッションテンプレートとともに新しいセッションを作成するために使用されます。 すべてのフィールドはオプションであり、差分のみを指定する必要があります。 したがって、{} は差分ゼロの有効な PUT 要求です。 サーバーの公式なセッションコピーに影響を与えずにマージの結果を返す仮想的な PUT 要求を実行するには、PUT 要求にクエリ文字列 ?nocommit=true を追加できます。 マルチプレイヤーおよびマッチメーキング REST API メソッドの要求と応答は JSON ドキュメントです。 マルチプレイヤーセッション要求構造については、MultiplayerSessionRequest (JSON) を参照してください。 関連する応答構造は、MultiplayerSession (JSON) に示されています。 応答構造は、セッションメンバーをリンクリストとしてフレーム化し、セッションとそのメンバーの他の読み取り専用プロパティを埋めます。

セッションとセッションテンプレートのクエリ (REST)

タイトルは、サービス構成レベルおよびセッションテンプレートレベルでセッション情報をクエリできます。 このセクションでは、マルチプレイヤー REST API を使用するクエリについて説明します。

基本的なセッション情報のクエリ

セッションディレクトリおよびマッチメーキング URI を使用して、基本的なセッション情報のクエリをセットアップできます。 クエリの結果は、いくつかのセッションデータをインラインで含む、セッション参照の JSON 配列です。 デフォルトでは、クエリは最大 100 個の非プライベートセッションを取得します。
すべてのクエリには、キーワードフィルター、XUID フィルター、またはその両方を含める必要があります。

セッションテンプレートのクエリ

SCID のセッションテンプレートリスト、および特定のセッションテンプレートの詳細を取得するには、次のいずれかの URI に対して GET メソッドを使用します。
  • /serviceconfigs//sessiontemplates
  • /serviceconfigs//sessiontemplates/

セッション状態のクエリ

セッション状態をクエリするには、次のいずれかの URI に対して GET メソッドを使用します。
  • /serviceconfigs//sessions
  • /serviceconfigs//sessiontemplates//sessions
このトピックの先頭に戻る。

Multiplayer Session Explorer

Multiplayer Session Explorer は、MPSD に組み込まれた、セッション、セッションテンプレート、およびローカライゼーション文字列を閲覧するためのツールです。 このツールは、開発サンドボックスでのみ使用することを目的としています。

Multiplayer Session Explorer にアクセスする

このツールを使用するには、サインインする必要があります。閲覧できるのは、サインインしているユーザーがメンバーであるセッションに限定されます。
Multiplayer Session Explorer にアクセスするには、XBOX One (以降) コンソールでブラウザを開き、View ボタンを押して、Address ボックスに https://sessiondirectory.xboxlive.com/debug と入力します。
RETAIL サンドボックスでこのツールにアクセスしようとすると、HTTP/404 ステータスコードを受信します。このコードの詳細については、マルチプレイヤーセッションのステータスコード を参照してください。

メインページを開く

  1. ツールのメインページを開きます。セキュリティコンテキスト (サインインしているユーザーとサンドボックス) およびサンドボックス内の SCID のリストが表示されます。
  2. Menu ボタンを押してこのページをホームに固定すると、URI を再入力する必要がなくなります。

利用可能なセッションとテンプレートを表示する

  1. ツールで SCID を選択して、その SCID 内のサインインユーザーがメンバーとして含まれているセッションのリストを表示します。
  2. 同じページで、SCID を選択して、SCID のサービス構成内のセッションテンプレートおよびローカライゼーション文字列を表示できます。これらの項目は Partner Center 経由で取り込まれます。

セッションの全内容を表示する

Multiplayer Session Explorer で、セッション名を選択して対応するセッションの全内容を表示します。 MPSD によって表示されるセッションは、次の理由により、セッションの URI に対する標準の GET メソッドへの応答と異なる場合があります。
  • GET 呼び出しが X-Xbl-Contract-Version ヘッダーで古いコントラクトバージョンを使用している可能性があります。Multiplayer Session Explorer は常に最新のコントラクトバージョンを使用してセッションを表示します。
  • セッションが GET 経由で通常通り要求されると、期限切れタイムアウトなどの変換と副作用がトリガーされる可能性があります。Multiplayer Session Explorer は、ロジック、変換、または副作用を実行することなく、セッションが保存されているスナップショットを表示します。
  • nextTimer JSON オブジェクトフィールドは、副作用と同時に計算されるため、MPSD セッションには存在しません。
このトピックの先頭に戻る。

参照

このトピックの先頭に戻る。
最終更新日 2026年8月25日