- Multiplayer Session Directory (MPSD) セッション変更通知の購読
- MPSD セッションを作成する
- MPSD セッションの arbiter を設定する
- タイトルアクティベーションを管理する
- ユーザーが参加できる状態にする
- ゲーム招待を送信する
- ロビーセッションからゲームセッションに参加する
- タイトルアクティベーションから MPSD セッションに参加する
- ユーザーの現在のアクティビティを設定する
- MPSD セッションを更新する
- MPSD セッションから離脱する
- マッチメーキング中に空いているセッションスロットを埋める
- マッチチケットを作成する
- マッチチケットのステータスを取得する
Multiplayer Session Directory (MPSD) セッション変更通知の購読
セッションの変更を購読するには、関連するプレイヤーがセッションでアクティブである必要があります。また、セッションの
/constants/system/capabilities オブジェクトで connectionRequiredForActiveMembers フィールドを true に設定する必要があります。このフィールドは通常、セッションテンプレートで設定します。詳細については、マルチプレイヤーセッションテンプレート および Multiplayer Session Directory の概要 を参照してください。-
同じユーザーによるすべての呼び出しに対して、同じ
XblContextHandleオブジェクトを使用します。購読はこのオブジェクトの有効期間に紐付いています。ローカルユーザーが複数いる場合は、各ユーザーに対して個別のXblContextHandleオブジェクトを使用します。 - XblMultiplayerAddSessionChangedHandler および XblMultiplayerSessionSubscriptionLostHandler のイベントハンドラーを実装します。
-
複数のユーザーの変更を購読する場合は、不要な作業を避けるために
XblMultiplayerAddSessionChangedHandlerイベントハンドラーにコードを追加します。XblMultiplayerSessionChangeEventArgs::Branchプロパティと XblMultiplayerSessionChangeEventArgs::ChangeNumberプロパティを使用します。これらのプロパティを使用すると、最後に確認した変更を追跡し、古い変更を無視できます。 - XblMultiplayerSetSubscriptionsEnabled を呼び出して購読を許可します。
- ローカルセッションオブジェクトを作成してから、そのセッションにアクティブとして参加します。
-
通知を受けるセッション変更タイプを渡して、各ユーザーに対して
XblMultiplayerAddSessionChangedHandlerを呼び出します。 - このトピックの MPSD セッションを更新する セクションで説明されているように、セッションを MPSD に書き込みます。
重複したセッション変更通知の解析
同じセッションの通知に複数のユーザーが購読している場合、そのセッションへのすべての変更で各ユーザーに対してショルダータップがトリガーされます。 これらのショルダータップのうち 1 つを除いてすべては重複です。 セッション内のすべてのユーザーが通知を購読することを引き続き推奨しますが、タイトルはすでに通知された変更は無視する必要があります。これはBranch と ChangeNumber プロパティを使用して行うことができます。
複数のショルダータップを検出するために、タイトルは次のことを行う必要があります。
-
評価された各
Branchプロパティ値に対して最新のChangeNumberプロパティ値を保存します。 -
ショルダータップが、その
Branchプロパティ値に対して保存されている最新の値よりも高いChangeNumberプロパティ値を持つ場合、ショルダータップを処理してから、最新のChangeNumberプロパティ値を更新します。 -
ショルダータップが、その
Branchプロパティ値に対してより高いChangeNumberプロパティ値を持たない場合、ショルダータップの処理をスキップします。そのセッション変更はすでに処理されています。
ChangeNumber プロパティ値は、セッションではなく Branch プロパティ値によって追跡する必要があります。Branch プロパティ値は、セッションの有効期間内に変更されることがあり、その場合 ChangeNumber プロパティ値がリセットされます。MPSD セッションを作成する
デフォルトでは、MPSD セッションは最初のメンバーが参加したときに作成されます。タイトルロジックが、参加時にタイトルが存在するか存在しないかを想定している場合は、セッション更新中に write メソッドに適切な書き込みモードの値を渡すことができます。
-
新しい
XblContextHandleオブジェクトを作成します。タイトルはこのオブジェクトを一度作成して保存し、ソースコード全体を通じて必要に応じて再利用します。特にセッション購読を扱う場合には、まったく同じコンテキストを使用することが必要です。 -
XblMultiplayerSessionCreateHandle を使用して新しい
XblMultiplayerSessionHandleを作成し、MPSD が新しいセッションを作成するために必要なすべてのセッションデータを準備します。 - セッションを MPSD に書き込む前に必要な変更を行います。たとえば、XblMultiplayerSessionJoin の呼び出しでメンバーをセッションに参加させる場合、クライアントは、セッションを更新する呼び出し時に参加するよう MPSD に指示する隠しローカル要求データを追加します。
- ローカル変更が完了したら、このトピックの MPSD セッションを更新する セクションで説明されているように、それらを MPSD に書き込みます。
-
MPSD から、多くのフィールドが埋め込まれた新しい
XblMultiplayerSessionHandleオブジェクトを受け取ります。 - 今後は新しいセッションオブジェクトを使用します。新しいセッションを作成するための隠し要求を含む古いコピーを破棄します。
例
Flat C API- XAsyncBlock
- XblMultiplayerSessionCreateHandle
- XblMultiplayerSessionInitArgs
- XblMultiplayerSessionReference
- XblMultiplayerSessionWriteMode
- XblMultiplayerWriteSessionAsync
- XblMultiplayerWriteSessionResult
MPSD セッションの arbiter を設定する
タイトルは、既に作成されたセッションの arbiter を設定するために、次の手順を使用します。メンバー (潜在的なホスト) のデバイストークンは、メンバーがセッションに参加し、セキュアデバイスアドレスを含めるまで利用できません。
-
XblMultiplayerSessionMembers を呼び出して、ホスト候補のデバイストークンを MPSD から取得します。
[!NOTE] セッションが SmartMatch マッチメーキングによって作成された場合、クライアントは XblMultiplayerSessionHostCandidates を呼び出して MPSD から利用可能なホスト候補を使用できます。
- ホスト候補のリストから必要なホストを選択します。
- XblMultiplayerSessionSetHostDeviceToken を呼び出して、MPSD のローカルキャッシュにデバイストークンを設定します。ホストデバイストークンを設定する呼び出しが成功すると、ローカルのデバイストークンがホストのトークンを置き換えます。
-
ホストデバイストークンを設定しようとしたときに HTTP/412 ステータスコードを受信した場合は、セッションデータをクエリします。ホストデバイストークンがローカルコンソール用であるかどうかを確認します。ローカルコンソール用でない場合、別のコンソールが arbiter として指定されています。
[!NOTE] HTTP/412 は標準的な失敗を示さないため、クライアントは HTTP/412 ステータスコードを他の HTTP コードとは別に処理する必要があります。このステータスコードの詳細については、マルチプレイヤーセッションのステータスコード を参照してください。
-
このトピックの MPSD セッションを更新する セクションで説明されているように、MPSD 内のセッションを更新します。
[!NOTE] より良いアルゴリズムがない場合、クライアントは各ホスト候補がまだ誰も自分自身をホストとして設定していない場合に、自分自身をホストとして設定しようとする貪欲アルゴリズムを実装できます。詳細については、Multiplayer Session advanced topics トピックの Session arbiter セクションを参照してください。
タイトルアクティベーションを管理する
XBOX One (以降) は、プロトコルアクティベーション中にCoreApplicationView.Activated イベントを発生させます。
マルチプレイヤー API のコンテキストでは、このイベントは、ユーザーが招待を受け入れるか、別のユーザーに参加したときに発生します。
これらのアクションは、タイトルが対応する必要のあるアクティベーションをトリガーし、参加ユーザーをターゲットユーザーとゲームプレイに導く必要があります。
タイトルはいつでも新しいアクティベーション引数を予期する必要があり、長さに対してコーディングしてはいけません。
-
CoreApplicationView.Activatedイベントのイベントハンドラーをセットアップします。このハンドラーは、タイトルがすでに実行されている場合でも、プロトコルアクティベーションが発生するたびにトリガーされます。 - タイトルアクティベーション時に、セッションを開始し、セッション変更通知を購読します。詳細については、このトピックの MPSD セッション変更通知の購読 を参照してください。
- ユーザーをセッションにアクティブとして参加させます。詳細については、このトピックの タイトルアクティベーションから MPSD セッションに参加する を参照してください。
- プロファイル UI 経由で公開されるアクティビティセッションとしてロビーセッションを設定します。詳細については、このトピックの ユーザーの現在のアクティビティを設定する を参照してください。
- ユーザーをゲームセッションにアクティブとして参加させます。ユーザーはピアに接続してゲームプレイまたはロビーに入ることができます。
ユーザーが参加できる状態にする
ユーザーを参加可能にするには、タイトルは次のことを行う必要があります。- セッションオブジェクトを作成してから、必要に応じて属性を変更します。
- ユーザーをセッションにアクティブとして参加させます。詳細については、このトピックの タイトルアクティベーションから MPSD セッションに参加する を参照してください。
- ユーザーがセッションの arbiter として指定されているかどうかを判断します。
- ユーザーが arbiter でない場合は、手順 7 に進みます。
- ユーザーが arbiter の場合は、XblMultiplayerSessionSetHostDeviceToken を呼び出します。
- XblMultiplayerWriteSessionAsync の呼び出しを使用してセッションを書き込みます。
- セッションをアクティブなセッションとして設定します。詳細については、このトピックの ユーザーの現在のアクティビティを設定する を参照してください。
ゲーム招待を送信する
タイトルは、次の方法でプレイヤーがゲーム招待を送信できるようにします。- ロビーセッションの招待を送信します。
- ゲームセッション参照を使用して、汎用 XBOX プラットフォームの招待 UI を使用して招待を送信します。
- 招待するゲームプレイヤーを参加可能にします。詳細については、このトピックの ユーザーが参加できる状態にする を参照してください。
- 招待をロビーセッション経由で送信するか、招待 UI を使用して送信するかを決定します。
- ロビーセッションを使用している場合は、XblMultiplayerSendInvitesAsync の呼び出しを使用して招待を送信します。このメソッドは、XGameUiShowPlayerPickerAsync を呼び出してゲーム内 UI 名簿を構築する必要があるかもしれません。
- 招待 UI を使用している場合は、XGameUiShowSendGameInviteAsync を呼び出して招待 UI を表示します。
- リモートプレイヤーが参加した後、ローカルプレイヤーの XblMultiplayerAddSessionChangedHandler を処理します。
- リモートプレイヤーのために、タイトルアクティベーションコードを実装します。詳細については、このトピックの タイトルアクティベーションを管理する を参照してください。
ロビーセッションからゲームセッションに参加する
Windows 10 デバイスのゲームプレイセッションは、大規模セッションでない場合はuserAuthorizationStyle 機能を true に設定する必要があります。その結果、joinRestriction プロパティは none にはできず、セッションを直接公開して参加可能にすることはできません。
一般的なシナリオは、ロビーセッションを作成してプレイヤーを集め、それらのプレイヤーをゲームプレイセッションまたはマッチメーキングセッションに移動することです。ただし、ゲームプレイセッションが公開参加可能でない場合、ゲームクライアントは joinRestriction 設定を満たさない限りゲームプレイセッションに参加できません。ほとんどの場合、このシナリオでは制限が厳しすぎます。
解決策は、ロビーセッションとゲームセッションをリンクするために転送ハンドルを使用することです。タイトルは次の方法でこれを実現できます。
- ゲームセッションを作成する際に、XblMultiplayerSetTransferHandleAsync API を使用して、ロビーセッションとゲームセッションをリンクする転送ハンドルを作成します。
- ゲームセッションのセッション参照の代わりに、転送ハンドルの GUID をロビーセッションに格納します。
- タイトルがロビーセッションからゲームセッションにメンバーを移動したい場合、各クライアントはロビーセッションからの転送ハンドルを使用して XblMultiplayerWriteSessionByHandleAsync API を使用してゲームセッションに参加します。
- MPSD はロビーセッションを検索して、転送ハンドルを使用してゲームセッションに参加しようとしているメンバーがロビーセッションにも存在することを検証します。
- メンバーがロビーセッションに存在する場合、ゲームセッションにアクセスできます。
タイトルアクティベーションから MPSD セッションに参加する
ユーザーが XBOX シェル UI を使用してフレンドのアクティビティに参加するか、招待を受け入れることを選択すると、タイトルは、ユーザーが参加したいセッションを示すパラメーターでアクティブ化されます。タイトルはこのアクティベーションを処理し、対応するセッションにユーザーを追加する必要があります。 タイトルが従うべき手順は次のとおりです。-
CoreApplicationView.Activatedイベントのイベントハンドラーを実装します。これはタイトルのアクティベーションを通知します。 -
ハンドラーが発生したら、
IActivatedEventArgs.Kindプロパティを調べます。Protocolに設定されている場合、イベント引数をProtocolActivatedEventArgsクラスにキャストします。 -
ProtocolActivatedEventArgsオブジェクトを調べます。ProtocolActivatedEventArgs.Uriプロパティで示される URI がinviteHandleAccept(受け入れられた招待に対応する) またはactivityHandleJoin(シェル UI 経由の参加に対応する) のいずれかに一致する場合、URI のクエリ文字列を解析します。キーと値のペアを持つ通常の URI クエリ文字列としてフォーマットされており、次のフィールドを抽出します。- 受け入れられた招待の場合:
handleinvitedXuidsenderXuid
- 参加の場合:
handlejoinerXuidjoineeXuid
- 受け入れられた招待の場合:
- タイトルのマルチプレイヤーコードを開始します。これには XblMultiplayerSetSubscriptionsEnabled の呼び出しを含める必要があります。
-
XblMultiplayerSessionCreateHandle を呼び出して、ローカル
XblMultiplayerSessionHandleオブジェクトを作成します。 -
XblMultiplayerSessionJoin を呼び出してセッションに参加します。参加をアクティブに設定するように、次のパラメーター設定を使用します。
memberCustomConstantsJson=nullinitializeRequested=falsejoinWithActiveStatus=true
- XblMultiplayerSessionSetSessionChangeSubscription を呼び出して、参加後にセッションが変更されたときにショルダータップを受けるようにします。
- 手順 3 で説明したように取得したハンドルを使用して XblMultiplayerWriteSessionByHandleAsync を呼び出します。ユーザーがセッションのメンバーになり、セッション内のデータを使用してゲームに接続できるようになります。
ユーザーの現在のアクティビティを設定する
ユーザーの現在のアクティビティは、タイトルの XBOX ダッシュボードユーザーエクスペリエンスに表示されます。ユーザーのアクティビティは、セッション経由またはタイトルアクティベーション経由で設定できます。後者の場合、ユーザーはマッチメーキング経由またはゲームを開始することによってセッションに入ります。セッション経由で設定されたアクティビティは、XblMultiplayerClearActivityAsync を呼び出すことで削除できます。
MPSD セッションを更新する
タイトルがマルチプレイヤー API を使用して既存のセッションを更新する場合、セッションを書き込む呼び出しを行うまではローカルコピーで作業していることを覚えておいてください。
- 例えば XblMultiplayerSessionLeave を呼び出すなど、必要に応じて現在のセッションに変更を加えます。
-
すべての変更が完了したら、次のいずれかのメソッドを使用してローカル変更を MPSD に書き込みます。
他のタイトルも変更できる共有部分に書き込む場合は、書き込みモードを XblMultiplayerSessionWriteMode
::SynchronizedUpdateに設定します。詳細については、Multiplayer Session Directory overview トピックの Synchronization of session updates セクションを参照してください。 write メソッドは、参加をサーバーに書き込み、他のセッションメンバーとそのコンソールのセキュアデバイスアドレス (SDA) を発見するための最新のセッションを取得します。これらのコンソール間でネットワーク接続を確立する方法の詳細については、Introduction to Winsock on XBOX One を参照してください。 - 古いローカルセッションオブジェクトを破棄します。将来のアクションが最新の既知のセッション状態に基づくように、新しく取得したセッションオブジェクトを使用します。
MPSD セッションから離脱する
ユーザーがセッションから離脱できるようにするには、タイトルは次のことを行う必要があります。- ゲームセッションに対して XblMultiplayerSessionLeave を呼び出します。
- このトピックの MPSD セッションを更新する セクションで説明されているように、MPSD 内のゲームセッションを更新します。
-
必要に応じて、ロビーセッションに対して
XblMultiplayerSessionLeaveメソッドを呼び出し、そのセッションを更新します。 - ロビーセッションに必要な場合、XblMultiplayerRemoveSubscriptionLostHandler および XblMultiplayerRemoveSessionChangedHandler を呼び出して登録を解除することにより、マルチプレイヤー API をシャットダウンします。
マッチメーキング中に空いているセッションスロットを埋める
マッチメーキング中にチケットセッションの空きスロットを埋めるには、タイトルは次のような手順に従う必要があります。- マッチメーキング中に作成されたチケットセッションの最新のセッション状態にアクセスします。
- ロビーセッションからゲームプレイに利用可能なプレイヤーを追加します。
- チケットセッションが満員かどうかを判断します。
- セッションが満員の場合、ゲームプレイを続行します。
-
セッションがまだ満員でない場合、このトピックの マッチチケットを作成する で説明されているようにマッチチケットを作成します。
preserveSessionパラメーターをAlwaysに設定してチケットを作成することを確認してください。 - マッチメーキングを続行します。詳細については、マッチメーキングの概要 を参照してください。
マッチチケットを作成する
マッチチケットを作成するには、マッチメーキングのスカウトは次のことを行う必要があります。-
チケットセッションへの参照を渡して、XblMatchmakingCreateMatchTicketAsync を呼び出します。このメソッドは MPSD からチケットセッションを読み取り、セッション内のユーザーのマッチメーキングを開始します。内部的には、このメソッドは
POST (/serviceconfigs/{scid}/hoppers/{hoppername})を呼び出します。 -
マッチメーキングサービスがセッションのメンバーを新しいセッションまたは既存の別のセッションにマッチさせる場合は、
preserveSessionパラメーターをNeverに設定します。既存のゲームセッションをチケットセッションとして再利用してゲームプレイを続行することをタイトルが許可する場合は、preserveSessionパラメーターをAlwaysに設定します。これにより、マッチメーキングサービスは、送信されたセッションが保持され、一致したプレイヤーがそのセッションに追加されるようにできます。 -
CreateMatchTicketResponseオブジェクトで返される XblCreateMatchTicketResponse::EstimatedWaitTimeを使用して、マッチメーキング時間のユーザーの期待を設定します。 -
必要に応じて、応答オブジェクトで返される XblCreateMatchTicketResponse
::MatchTicketIdを使用して、チケットを削除することによってセッションのマッチメーキングをキャンセルします。チケットの削除には XblMatchmakingDeleteMatchTicketAsync を使用します。
マッチチケットのステータスを取得する
マッチチケットのステータスを取得するには、タイトルは次のことを行う必要があります。-
チケットセッションの
XblMultiplayerSessionHandleオブジェクトを取得します。 - XblMultiplayerSessionMatchmakingServer を呼び出して、マッチメーキングで使用された XblMultiplayerMatchmakingServer オブジェクトにアクセスします。
-
XblMultiplayerMatchmakingServerオブジェクトを確認して、マッチメーキングプロセスのステータス、セッションの典型的な待機時間、およびマッチが見つかった場合のターゲットセッション参照を判断します。
