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

# マルチプレイヤータスク

> MPSD の変更の購読、セッションの作成、招待の送信、参加、マッチメーキングチケット、アクティビティなど、一般的な 2015 Multiplayer タスクのコードサンプル。

<a id="top" />

このトピックでは、2015 Multiplayer の使用に関連する特定のタスクを実装する方法について説明します。

このトピックでは、以下について説明します。

* [Multiplayer Session Directory (MPSD) セッション変更通知の購読](#sfmscn)
* [MPSD セッションを作成する](#cams)
* [MPSD セッションの arbiter を設定する](#set-an-arbiter-for-an-mpsd-session)
* [タイトルアクティベーションを管理する](#mta)
* [ユーザーが参加できる状態にする](#mtuj)
* [ゲーム招待を送信する](#sgi)
* [ロビーセッションからゲームセッションに参加する](#jagsfals)
* [タイトルアクティベーションから MPSD セッションに参加する](#jamsfata)
* [ユーザーの現在のアクティビティを設定する](#stuca)
* [MPSD セッションを更新する](#update-an-mpsd-session)
* [MPSD セッションから離脱する](#lams)
* [マッチメーキング中に空いているセッションスロットを埋める](#fossdm)
* [マッチチケットを作成する](#camt)
* [マッチチケットのステータスを取得する](#gmts)

<a id="sfmscn" />

## Multiplayer Session Directory (MPSD) セッション変更通知の購読

<Note>セッションの変更を購読するには、関連するプレイヤーがセッションでアクティブである必要があります。また、セッションの `/constants/system/capabilities` オブジェクトで `connectionRequiredForActiveMembers` フィールドを `true` に設定する必要があります。このフィールドは通常、セッションテンプレートで設定します。詳細については、[マルチプレイヤーセッションテンプレート](/services/xbox-services/multiplayer/mpsd/concepts/live-session-templates) および [Multiplayer Session Directory の概要](/services/xbox-services/multiplayer/mpsd/live-mpsd-overview) を参照してください。</Note>

MPSD セッション変更通知を受信するには、タイトルは次の手順を使用できます。

1. 同じユーザーによるすべての呼び出しに対して、同じ `XblContextHandle` オブジェクトを使用します。購読はこのオブジェクトの有効期間に紐付いています。ローカルユーザーが複数いる場合は、各ユーザーに対して個別の `XblContextHandle` オブジェクトを使用します。

2. [XblMultiplayerAddSessionChangedHandler](/reference/live/xsapi-c/multiplayer_c/functions/xblmultiplayeraddsessionchangedhandler) および [XblMultiplayerSessionSubscriptionLostHandler](/reference/live/xsapi-c/multiplayer_c/functions/xblmultiplayersessionsubscriptionlosthandler) のイベントハンドラーを実装します。

3. 複数のユーザーの変更を購読する場合は、不要な作業を避けるために `XblMultiplayerAddSessionChangedHandler` イベントハンドラーにコードを追加します。[XblMultiplayerSessionChangeEventArgs](/reference/live/xsapi-c/multiplayer_c/structs/xblmultiplayersessionchangeeventargs)`::Branch` プロパティと [XblMultiplayerSessionChangeEventArgs](/reference/live/xsapi-c/multiplayer_c/structs/xblmultiplayersessionchangeeventargs)`::ChangeNumber` プロパティを使用します。これらのプロパティを使用すると、最後に確認した変更を追跡し、古い変更を無視できます。

4. [XblMultiplayerSetSubscriptionsEnabled](/reference/live/xsapi-c/multiplayer_c/functions/xblmultiplayersetsubscriptionsenabled) を呼び出して購読を許可します。

5. ローカルセッションオブジェクトを作成してから、そのセッションにアクティブとして参加します。

6. 通知を受けるセッション変更タイプを渡して、各ユーザーに対して `XblMultiplayerAddSessionChangedHandler` を呼び出します。

7. このトピックの [MPSD セッションを更新する](#update-an-mpsd-session) セクションで説明されているように、セッションを MPSD に書き込みます。

次のフローチャートは、前述の手順で説明したイベントを購読することによってマルチプレイヤーを開始する方法を示しています。

<img src="https://mintcdn.com/microsoft-4404708b/gzrdvT5kpqAXKEQt/images/gdk/services/Multiplayer_2015_Start_Multiplayer.png?fit=max&auto=format&n=gzrdvT5kpqAXKEQt&q=85&s=69f53200e2e51e3d975a3e5e7c9967fe" alt="前述の手順で説明したイベントを購読することによってマルチプレイヤーを開始する方法を示すフローチャートの画像。" width="493" height="456" data-path="images/gdk/services/Multiplayer_2015_Start_Multiplayer.png" />

### 重複したセッション変更通知の解析

同じセッションの通知に複数のユーザーが購読している場合、そのセッションへのすべての変更で各ユーザーに対してショルダータップがトリガーされます。
これらのショルダータップのうち 1 つを除いてすべては重複です。

セッション内のすべてのユーザーが通知を購読することを引き続き推奨しますが、タイトルはすでに通知された変更は無視する必要があります。これは `Branch` と `ChangeNumber` プロパティを使用して行うことができます。

複数のショルダータップを検出するために、タイトルは次のことを行う必要があります。

* 評価された各 `Branch` プロパティ値に対して最新の `ChangeNumber` プロパティ値を保存します。

* ショルダータップが、その `Branch` プロパティ値に対して保存されている最新の値よりも高い `ChangeNumber` プロパティ値を持つ場合、ショルダータップを処理してから、最新の `ChangeNumber` プロパティ値を更新します。

* ショルダータップが、その `Branch` プロパティ値に対してより高い `ChangeNumber` プロパティ値を持たない場合、ショルダータップの処理をスキップします。そのセッション変更はすでに処理されています。

<Note>`ChangeNumber` プロパティ値は、セッションではなく `Branch` プロパティ値によって追跡する必要があります。`Branch` プロパティ値は、セッションの有効期間内に変更されることがあり、その場合 `ChangeNumber` プロパティ値がリセットされます。</Note>

[このトピックの先頭に戻る。](#top)

<a id="cams" />

## MPSD セッションを作成する

<Note>デフォルトでは、MPSD セッションは最初のメンバーが参加したときに作成されます。タイトルロジックが、参加時にタイトルが存在するか存在しないかを想定している場合は、セッション更新中に write メソッドに適切な書き込みモードの値を渡すことができます。</Note>

タイトルは新しいセッションを作成するために次のことを行う必要があります。

1. 新しい `XblContextHandle` オブジェクトを作成します。タイトルはこのオブジェクトを一度作成して保存し、ソースコード全体を通じて必要に応じて再利用します。特にセッション購読を扱う場合には、まったく同じコンテキストを使用することが必要です。

2. [XblMultiplayerSessionCreateHandle](/reference/live/xsapi-c/multiplayer_c/functions/xblmultiplayersessioncreatehandle) を使用して新しい `XblMultiplayerSessionHandle` を作成し、MPSD が新しいセッションを作成するために必要なすべてのセッションデータを準備します。

3. セッションを MPSD に書き込む前に必要な変更を行います。たとえば、[XblMultiplayerSessionJoin](/reference/live/xsapi-c/multiplayer_c/functions/xblmultiplayersessionjoin) の呼び出しでメンバーをセッションに参加させる場合、クライアントは、セッションを更新する呼び出し時に参加するよう MPSD に指示する隠しローカル要求データを追加します。

4. ローカル変更が完了したら、このトピックの [MPSD セッションを更新する](#update-an-mpsd-session) セクションで説明されているように、それらを MPSD に書き込みます。

5. MPSD から、多くのフィールドが埋め込まれた新しい `XblMultiplayerSessionHandle` オブジェクトを受け取ります。

6. 今後は新しいセッションオブジェクトを使用します。新しいセッションを作成するための隠し要求を含む古いコピーを破棄します。

### 例

**Flat C API**

```cpp theme={null}
auto asyncBlock = std::make_unique<XAsyncBlock>();
asyncBlock->queue = queue;
asyncBlock->context = nullptr;
asyncBlock->callback = [](XAsyncBlock* asyncBlock)
{
    std::unique_ptr<XAsyncBlock> asyncBlockPtr{ asyncBlock }; // Take over ownership of the XAsyncBlock*.

    XblMultiplayerSessionHandle sessionHandle;
    HRESULT hr = XblMultiplayerWriteSessionResult(asyncBlock, &sessionHandle);
    if (SUCCEEDED(hr))
    {
        // Process multiplayer session handle.
    }
    else
    {
        // Handle failure.
    }
};

XblMultiplayerSessionReference ref;
pal::strcpy(ref.Scid, sizeof(ref.Scid), SCID);
pal::strcpy(ref.SessionTemplateName, sizeof(ref.SessionTemplateName), SESSION_TEMPLATE_NAME);
pal::strcpy(ref.SessionName, sizeof(ref.SessionName), SESSION_NAME);

XblMultiplayerSessionInitArgs args = {};

XblMultiplayerSessionHandle sessionHandle = XblMultiplayerSessionCreateHandle(XUID, &ref, &args);

auto hr = XblMultiplayerSessionJoin(
    sessionHandle,
    memberCustomConstantsJson.c_str(),
    initializeRequested,
    joinWithActiveStatus);
    
 hr = XblMultiplayerWriteSessionAsync(xblContextHandle, sessionHandle, XblMultiplayerSessionWriteMode::CreateNew, asyncBlock.get());
if (SUCCEEDED(hr))
{
    // The call succeeded, so release the std::unique_ptr ownership of XAsyncBlock* because the callback will take over ownership.
    // If the call fails, std::unique_ptr will keep ownership and delete XAsyncBlock*.
    asyncBlock.release();
}
```

詳細については、以下を参照してください。

* [XAsyncBlock](/reference/system/xasync/structs/xasyncblock)

* [XblMultiplayerSessionCreateHandle](/reference/live/xsapi-c/multiplayer_c/functions/xblmultiplayersessioncreatehandle)

* [XblMultiplayerSessionInitArgs](/reference/live/xsapi-c/multiplayer_c/structs/xblmultiplayersessioninitargs)

* [XblMultiplayerSessionReference](/reference/live/xsapi-c/multiplayer_c/structs/xblmultiplayersessionreference)

* [XblMultiplayerSessionWriteMode](/reference/live/xsapi-c/multiplayer_c/enums/xblmultiplayersessionwritemode)

* [XblMultiplayerWriteSessionAsync](/reference/live/xsapi-c/multiplayer_c/functions/xblmultiplayerwritesessionasync)

* [XblMultiplayerWriteSessionResult](/reference/live/xsapi-c/multiplayer_c/functions/xblmultiplayerwritesessionresult)

[このトピックの先頭に戻る。](#top)

<a id="set-an-arbiter-for-an-mpsd-session" />

## MPSD セッションの arbiter を設定する

タイトルは、既に作成されたセッションの arbiter を設定するために、次の手順を使用します。

<Note>メンバー (潜在的なホスト) のデバイストークンは、メンバーがセッションに参加し、セキュアデバイスアドレスを含めるまで利用できません。</Note>

1. [XblMultiplayerSessionMembers](/reference/live/xsapi-c/multiplayer_c/functions/xblmultiplayersessionmembers) を呼び出して、ホスト候補のデバイストークンを MPSD から取得します。

   > \[!NOTE]
   > セッションが SmartMatch マッチメーキングによって作成された場合、クライアントは [XblMultiplayerSessionHostCandidates](/reference/live/xsapi-c/multiplayer_c/functions/xblmultiplayersessionhostcandidates) を呼び出して MPSD から利用可能なホスト候補を使用できます。

2. ホスト候補のリストから必要なホストを選択します。

3. [XblMultiplayerSessionSetHostDeviceToken](/reference/live/xsapi-c/multiplayer_c/functions/xblmultiplayersessionsethostdevicetoken) を呼び出して、MPSD のローカルキャッシュにデバイストークンを設定します。ホストデバイストークンを設定する呼び出しが成功すると、ローカルのデバイストークンがホストのトークンを置き換えます。

4. ホストデバイストークンを設定しようとしたときに HTTP/412 ステータスコードを受信した場合は、セッションデータをクエリします。ホストデバイストークンがローカルコンソール用であるかどうかを確認します。ローカルコンソール用でない場合、別のコンソールが arbiter として指定されています。

   > \[!NOTE]
   > HTTP/412 は標準的な失敗を示さないため、クライアントは HTTP/412 ステータスコードを他の HTTP コードとは別に処理する必要があります。このステータスコードの詳細については、[マルチプレイヤーセッションのステータスコード](/services/xbox-services/multiplayer/mpsd/how-to/live-mpsd-status-codes) を参照してください。

5. このトピックの [MPSD セッションを更新する](#update-an-mpsd-session) セクションで説明されているように、MPSD 内のセッションを更新します。

   > \[!NOTE]
   > より良いアルゴリズムがない場合、クライアントは各ホスト候補がまだ誰も自分自身をホストとして設定していない場合に、自分自身をホストとして設定しようとする貪欲アルゴリズムを実装できます。詳細については、Multiplayer Session advanced topics トピックの [Session arbiter](/services/xbox-services/multiplayer/mpsd/concepts/live-mpsd-details#session-arbiter) セクションを参照してください。

[このトピックの先頭に戻る。](#top)

<a id="mta" />

## タイトルアクティベーションを管理する

XBOX One (以降) は、プロトコルアクティベーション中に `CoreApplicationView.Activated` イベントを発生させます。
マルチプレイヤー API のコンテキストでは、このイベントは、ユーザーが招待を受け入れるか、別のユーザーに参加したときに発生します。
これらのアクションは、タイトルが対応する必要のあるアクティベーションをトリガーし、参加ユーザーをターゲットユーザーとゲームプレイに導く必要があります。

<Note>タイトルはいつでも新しいアクティベーション引数を予期する必要があり、長さに対してコーディングしてはいけません。</Note>

タイトルは、タイトルアクティベーションを処理するために、次の主要な手順を実行する必要があります。

1. `CoreApplicationView.Activated` イベントのイベントハンドラーをセットアップします。このハンドラーは、タイトルがすでに実行されている場合でも、プロトコルアクティベーションが発生するたびにトリガーされます。

2. タイトルアクティベーション時に、セッションを開始し、セッション変更通知を購読します。詳細については、このトピックの [MPSD セッション変更通知の購読](#sfmscn) を参照してください。

3. ユーザーをセッションにアクティブとして参加させます。詳細については、このトピックの [タイトルアクティベーションから MPSD セッションに参加する](#jamsfata) を参照してください。

4. プロファイル UI 経由で公開されるアクティビティセッションとしてロビーセッションを設定します。詳細については、このトピックの [ユーザーの現在のアクティビティを設定する](#stuca) を参照してください。

5. ユーザーをゲームセッションにアクティブとして参加させます。ユーザーはピアに接続してゲームプレイまたはロビーに入ることができます。

次のフローチャートは、タイトルアクティベーションを処理する方法を示しています。

<img src="https://mintcdn.com/microsoft-4404708b/gzrdvT5kpqAXKEQt/images/gdk/services/Multiplayer_2015_OnActivation.png?fit=max&auto=format&n=gzrdvT5kpqAXKEQt&q=85&s=12c7da4ee04fdc9fe5c78471826cb9ed" alt="タイトルアクティベーションを処理する方法を示すフローチャートの画像。" width="982" height="1272" data-path="images/gdk/services/Multiplayer_2015_OnActivation.png" />

[このトピックの先頭に戻る。](#top)

<a id="mtuj" />

## ユーザーが参加できる状態にする

ユーザーを参加可能にするには、タイトルは次のことを行う必要があります。

1. セッションオブジェクトを作成してから、必要に応じて属性を変更します。

2. ユーザーをセッションにアクティブとして参加させます。詳細については、このトピックの [タイトルアクティベーションから MPSD セッションに参加する](#jamsfata) を参照してください。

3. ユーザーがセッションの arbiter として指定されているかどうかを判断します。

4. ユーザーが arbiter でない場合は、手順 7 に進みます。

5. ユーザーが arbiter の場合は、[XblMultiplayerSessionSetHostDeviceToken](/reference/live/xsapi-c/multiplayer_c/functions/xblmultiplayersessionsethostdevicetoken) を呼び出します。

6. [XblMultiplayerWriteSessionAsync](/reference/live/xsapi-c/multiplayer_c/functions/xblmultiplayerwritesessionasync) の呼び出しを使用してセッションを書き込みます。

7. セッションをアクティブなセッションとして設定します。詳細については、このトピックの [ユーザーの現在のアクティビティを設定する](#stuca) を参照してください。

次のフローチャートは、ゲーム中に他のプレイヤーがユーザーに参加できるようにする手順を示しています。

<img src="https://mintcdn.com/microsoft-4404708b/gzrdvT5kpqAXKEQt/images/gdk/services/Multiplayer_2015_Become_Joinable.png?fit=max&auto=format&n=gzrdvT5kpqAXKEQt&q=85&s=2b2f2be1ab3913793e41659a356e5aa1" alt="ゲーム中に他のプレイヤーがユーザーに参加できるようにする手順を示すフローチャートの画像。" width="607" height="869" data-path="images/gdk/services/Multiplayer_2015_Become_Joinable.png" />

[このトピックの先頭に戻る。](#top)

<a id="sgi" />

## ゲーム招待を送信する

タイトルは、次の方法でプレイヤーがゲーム招待を送信できるようにします。

* ロビーセッションの招待を送信します。
* ゲームセッション参照を使用して、汎用 XBOX プラットフォームの招待 UI を使用して招待を送信します。

プレイヤーのゲーム招待を送信するには、タイトルは次のことを行う必要があります。

1. 招待するゲームプレイヤーを参加可能にします。詳細については、このトピックの [ユーザーが参加できる状態にする](#mtuj) を参照してください。

2. 招待をロビーセッション経由で送信するか、招待 UI を使用して送信するかを決定します。

3. ロビーセッションを使用している場合は、[XblMultiplayerSendInvitesAsync](/reference/live/xsapi-c/multiplayer_c/functions/xblmultiplayersendinvitesasync) の呼び出しを使用して招待を送信します。このメソッドは、[XGameUiShowPlayerPickerAsync](/reference/system/xgameui/functions/xgameuishowplayerpickerasync) を呼び出してゲーム内 UI 名簿を構築する必要があるかもしれません。

4. 招待 UI を使用している場合は、[XGameUiShowSendGameInviteAsync](/reference/system/xgameui/functions/xgameuishowsendgameinviteasync) を呼び出して招待 UI を表示します。

5. リモートプレイヤーが参加した後、ローカルプレイヤーの [XblMultiplayerAddSessionChangedHandler](/reference/live/xsapi-c/multiplayer_c/functions/xblmultiplayeraddsessionchangedhandler) を処理します。

6. リモートプレイヤーのために、タイトルアクティベーションコードを実装します。詳細については、このトピックの [タイトルアクティベーションを管理する](#mta) を参照してください。

次のフローチャートは、招待の送信方法を示しています。

<img src="https://mintcdn.com/microsoft-4404708b/gzrdvT5kpqAXKEQt/images/gdk/services/Multiplayer_2015_Send_Invites.png?fit=max&auto=format&n=gzrdvT5kpqAXKEQt&q=85&s=98dd44729bea6ad14c2cc7f54f7c30a2" alt="招待の送信方法を示すフローチャートの画像。" width="922" height="736" data-path="images/gdk/services/Multiplayer_2015_Send_Invites.png" />

[このトピックの先頭に戻る。](#top)

<a id="jagsfals" />

## ロビーセッションからゲームセッションに参加する

Windows 10 デバイスのゲームプレイセッションは、大規模セッションでない場合は `userAuthorizationStyle` 機能を `true` に設定する必要があります。その結果、`joinRestriction` プロパティは `none` にはできず、セッションを直接公開して参加可能にすることはできません。

一般的なシナリオは、ロビーセッションを作成してプレイヤーを集め、それらのプレイヤーをゲームプレイセッションまたはマッチメーキングセッションに移動することです。ただし、ゲームプレイセッションが公開参加可能でない場合、ゲームクライアントは `joinRestriction` 設定を満たさない限りゲームプレイセッションに参加できません。ほとんどの場合、このシナリオでは制限が厳しすぎます。

解決策は、ロビーセッションとゲームセッションをリンクするために転送ハンドルを使用することです。タイトルは次の方法でこれを実現できます。

1. ゲームセッションを作成する際に、[XblMultiplayerSetTransferHandleAsync](/reference/live/xsapi-c/multiplayer_c/functions/xblmultiplayersettransferhandleasync) API を使用して、ロビーセッションとゲームセッションをリンクする転送ハンドルを作成します。

2. ゲームセッションのセッション参照の代わりに、転送ハンドルの GUID をロビーセッションに格納します。

3. タイトルがロビーセッションからゲームセッションにメンバーを移動したい場合、各クライアントはロビーセッションからの転送ハンドルを使用して [XblMultiplayerWriteSessionByHandleAsync](/reference/live/xsapi-c/multiplayer_c/functions/xblmultiplayerwritesessionbyhandleasync) API を使用してゲームセッションに参加します。

4. MPSD はロビーセッションを検索して、転送ハンドルを使用してゲームセッションに参加しようとしているメンバーがロビーセッションにも存在することを検証します。

5. メンバーがロビーセッションに存在する場合、ゲームセッションにアクセスできます。

[このトピックの先頭に戻る。](#top)

<a id="jamsfata" />

## タイトルアクティベーションから MPSD セッションに参加する

ユーザーが XBOX シェル UI を使用してフレンドのアクティビティに参加するか、招待を受け入れることを選択すると、タイトルは、ユーザーが参加したいセッションを示すパラメーターでアクティブ化されます。タイトルはこのアクティベーションを処理し、対応するセッションにユーザーを追加する必要があります。

タイトルが従うべき手順は次のとおりです。

1. `CoreApplicationView.Activated` イベントのイベントハンドラーを実装します。これはタイトルのアクティベーションを通知します。

2. ハンドラーが発生したら、`IActivatedEventArgs.Kind` プロパティを調べます。`Protocol` に設定されている場合、イベント引数を `ProtocolActivatedEventArgs` クラスにキャストします。

3. `ProtocolActivatedEventArgs` オブジェクトを調べます。`ProtocolActivatedEventArgs.Uri` プロパティで示される URI が `inviteHandleAccept` (受け入れられた招待に対応する) または `activityHandleJoin` (シェル UI 経由の参加に対応する) のいずれかに一致する場合、URI のクエリ文字列を解析します。キーと値のペアを持つ通常の URI クエリ文字列としてフォーマットされており、次のフィールドを抽出します。
   * 受け入れられた招待の場合:
     1. `handle`
     2. `invitedXuid`
     3. `senderXuid`
   * 参加の場合:
     1. `handle`
     2. `joinerXuid`
     3. `joineeXuid`

4. タイトルのマルチプレイヤーコードを開始します。これには [XblMultiplayerSetSubscriptionsEnabled](/reference/live/xsapi-c/multiplayer_c/functions/xblmultiplayersetsubscriptionsenabled) の呼び出しを含める必要があります。

5. [XblMultiplayerSessionCreateHandle](/reference/live/xsapi-c/multiplayer_c/functions/xblmultiplayersessioncreatehandle) を呼び出して、ローカル `XblMultiplayerSessionHandle` オブジェクトを作成します。

6. [XblMultiplayerSessionJoin](/reference/live/xsapi-c/multiplayer_c/functions/xblmultiplayersessionjoin) を呼び出してセッションに参加します。参加をアクティブに設定するように、次のパラメーター設定を使用します。
   * `memberCustomConstantsJson` = `null`
   * `initializeRequested` = `false`
   * `joinWithActiveStatus` = `true`

7. [XblMultiplayerSessionSetSessionChangeSubscription](/reference/live/xsapi-c/multiplayer_c/functions/xblmultiplayersessionsetsessionchangesubscription) を呼び出して、参加後にセッションが変更されたときにショルダータップを受けるようにします。

8. 手順 3 で説明したように取得したハンドルを使用して [XblMultiplayerWriteSessionByHandleAsync](/reference/live/xsapi-c/multiplayer_c/functions/xblmultiplayerwritesessionbyhandleasync) を呼び出します。ユーザーがセッションのメンバーになり、セッション内のデータを使用してゲームに接続できるようになります。

[このトピックの先頭に戻る。](#top)

<a id="stuca" />

## ユーザーの現在のアクティビティを設定する

ユーザーの現在のアクティビティは、タイトルの XBOX ダッシュボードユーザーエクスペリエンスに表示されます。ユーザーのアクティビティは、セッション経由またはタイトルアクティベーション経由で設定できます。後者の場合、ユーザーはマッチメーキング経由またはゲームを開始することによってセッションに入ります。

<Note>セッション経由で設定されたアクティビティは、[XblMultiplayerClearActivityAsync](/reference/live/xsapi-c/multiplayer_c/functions/xblmultiplayerclearactivityasync) を呼び出すことで削除できます。</Note>

セッションをユーザーの現在のアクティビティとして設定するには、タイトルは [XblMultiplayerSetActivityAsync](/reference/live/xsapi-c/multiplayer_c/functions/xblmultiplayersetactivityasync) を呼び出します。セッションのセッション参照を渡します。

タイトルアクティベーションを通じてユーザーの現在のアクティビティを設定するには、このトピックの [タイトルアクティベーションから MPSD セッションに参加する](#jamsfata) を参照してください。

[このトピックの先頭に戻る。](#top)

<a id="update-an-mpsd-session" />

## MPSD セッションを更新する

<Note>タイトルがマルチプレイヤー API を使用して既存のセッションを更新する場合、セッションを書き込む呼び出しを行うまではローカルコピーで作業していることを覚えておいてください。</Note>

既存のセッションを更新するには、タイトルは次のことを行う必要があります。

1. 例えば [XblMultiplayerSessionLeave](/reference/live/xsapi-c/multiplayer_c/functions/xblmultiplayersessionleave) を呼び出すなど、必要に応じて現在のセッションに変更を加えます。

2. すべての変更が完了したら、次のいずれかのメソッドを使用してローカル変更を MPSD に書き込みます。

   * [XblMultiplayerWriteSessionAsync](/reference/live/xsapi-c/multiplayer_c/functions/xblmultiplayerwritesessionasync)
   * [XblMultiplayerWriteSessionByHandleAsync](/reference/live/xsapi-c/multiplayer_c/functions/xblmultiplayerwritesessionbyhandleasync)

   他のタイトルも変更できる共有部分に書き込む場合は、書き込みモードを [XblMultiplayerSessionWriteMode](/reference/live/xsapi-c/multiplayer_c/enums/xblmultiplayersessionwritemode)`::SynchronizedUpdate` に設定します。詳細については、Multiplayer Session Directory overview トピックの [Synchronization of session updates](/services/xbox-services/multiplayer/mpsd/live-mpsd-overview#synchronization-of-session-updates) セクションを参照してください。

   write メソッドは、参加をサーバーに書き込み、他のセッションメンバーとそのコンソールのセキュアデバイスアドレス (SDA) を発見するための最新のセッションを取得します。これらのコンソール間でネットワーク接続を確立する方法の詳細については、Introduction to Winsock on XBOX One を参照してください。

3. 古いローカルセッションオブジェクトを破棄します。将来のアクションが最新の既知のセッション状態に基づくように、新しく取得したセッションオブジェクトを使用します。

[このトピックの先頭に戻る。](#top)

<a id="lams" />

## MPSD セッションから離脱する

ユーザーがセッションから離脱できるようにするには、タイトルは次のことを行う必要があります。

1. ゲームセッションに対して [XblMultiplayerSessionLeave](/reference/live/xsapi-c/multiplayer_c/functions/xblmultiplayersessionleave) を呼び出します。

2. このトピックの [MPSD セッションを更新する](#update-an-mpsd-session) セクションで説明されているように、MPSD 内のゲームセッションを更新します。

3. 必要に応じて、ロビーセッションに対して `XblMultiplayerSessionLeave` メソッドを呼び出し、そのセッションを更新します。

4. ロビーセッションに必要な場合、[XblMultiplayerRemoveSubscriptionLostHandler](/reference/live/xsapi-c/multiplayer_c/functions/xblmultiplayerremovesubscriptionlosthandler) および [XblMultiplayerRemoveSessionChangedHandler](/reference/live/xsapi-c/multiplayer_c/functions/xblmultiplayerremovesessionchangedhandler) を呼び出して登録を解除することにより、マルチプレイヤー API をシャットダウンします。

次のフローチャートは、セッションから離脱し、マルチプレイヤーをシャットダウンする方法を示しています。

<img src="https://mintcdn.com/microsoft-4404708b/gzrdvT5kpqAXKEQt/images/gdk/services/Multiplayer_2015_Shut_Down.png?fit=max&auto=format&n=gzrdvT5kpqAXKEQt&q=85&s=1b43ed2e21a28db2347eb8fd9f831aef" alt="セッションから離脱し、マルチプレイヤーをシャットダウンする方法を示すフローチャートの画像。" width="694" height="787" data-path="images/gdk/services/Multiplayer_2015_Shut_Down.png" />

[このトピックの先頭に戻る。](#top)

<a id="fossdm" />

## マッチメーキング中に空いているセッションスロットを埋める

マッチメーキング中にチケットセッションの空きスロットを埋めるには、タイトルは次のような手順に従う必要があります。

1. マッチメーキング中に作成されたチケットセッションの最新のセッション状態にアクセスします。

2. ロビーセッションからゲームプレイに利用可能なプレイヤーを追加します。

3. チケットセッションが満員かどうかを判断します。

4. セッションが満員の場合、ゲームプレイを続行します。

5. セッションがまだ満員でない場合、このトピックの [マッチチケットを作成する](#camt) で説明されているようにマッチチケットを作成します。`preserveSession` パラメーターを `Always` に設定してチケットを作成することを確認してください。

6. マッチメーキングを続行します。詳細については、[マッチメーキングの概要](/services/xbox-services/multiplayer/matchmaking/live-matchmaking-overview) を参照してください。

次のフローチャートは、マッチメーキング中に空いているセッションスロットを埋める方法を示しています。

<img src="https://mintcdn.com/microsoft-4404708b/gzrdvT5kpqAXKEQt/images/gdk/services/Multiplayer_2015_Fill_Open_Slots.png?fit=max&auto=format&n=gzrdvT5kpqAXKEQt&q=85&s=536853a998a165affa7552a02f87d778" alt="マッチメーキング中に空いているセッションスロットを埋める方法を示すフローチャートの画像。" width="794" height="716" data-path="images/gdk/services/Multiplayer_2015_Fill_Open_Slots.png" />

[このトピックの先頭に戻る。](#top)

<a id="camt" />

## マッチチケットを作成する

マッチチケットを作成するには、マッチメーキングのスカウトは次のことを行う必要があります。

1. チケットセッションへの参照を渡して、[XblMatchmakingCreateMatchTicketAsync](/reference/live/xsapi-c/matchmaking_c/functions/xblmatchmakingcreatematchticketasync) を呼び出します。このメソッドは MPSD からチケットセッションを読み取り、セッション内のユーザーのマッチメーキングを開始します。内部的には、このメソッドは `POST (/serviceconfigs/{scid}/hoppers/{hoppername})` を呼び出します。

2. マッチメーキングサービスがセッションのメンバーを新しいセッションまたは既存の別のセッションにマッチさせる場合は、`preserveSession` パラメーターを `Never` に設定します。既存のゲームセッションをチケットセッションとして再利用してゲームプレイを続行することをタイトルが許可する場合は、`preserveSession` パラメーターを `Always` に設定します。これにより、マッチメーキングサービスは、送信されたセッションが保持され、一致したプレイヤーがそのセッションに追加されるようにできます。

3. `CreateMatchTicketResponse` オブジェクトで返される [XblCreateMatchTicketResponse](/reference/live/xsapi-c/matchmaking_c/structs/xblcreatematchticketresponse)`::EstimatedWaitTime` を使用して、マッチメーキング時間のユーザーの期待を設定します。

4. 必要に応じて、応答オブジェクトで返される [XblCreateMatchTicketResponse](/reference/live/xsapi-c/matchmaking_c/structs/xblcreatematchticketresponse)`::MatchTicketId` を使用して、チケットを削除することによってセッションのマッチメーキングをキャンセルします。チケットの削除には [XblMatchmakingDeleteMatchTicketAsync](/reference/live/xsapi-c/matchmaking_c/functions/xblmatchmakingdeletematchticketasync) を使用します。

[このトピックの先頭に戻る。](#top)

<a id="gmts" />

## マッチチケットのステータスを取得する

マッチチケットのステータスを取得するには、タイトルは次のことを行う必要があります。

1. チケットセッションの `XblMultiplayerSessionHandle` オブジェクトを取得します。

2. [XblMultiplayerSessionMatchmakingServer](/reference/live/xsapi-c/multiplayer_c/functions/xblmultiplayersessionmatchmakingserver) を呼び出して、マッチメーキングで使用された [XblMultiplayerMatchmakingServer](/reference/live/xsapi-c/multiplayer_c/structs/xblmultiplayermatchmakingserver) オブジェクトにアクセスします。

3. `XblMultiplayerMatchmakingServer` オブジェクトを確認して、マッチメーキングプロセスのステータス、セッションの典型的な待機時間、およびマッチが見つかった場合のターゲットセッション参照を判断します。


## Related topics

- [Multiplayer Session Directory (MPSD) のサンプルコード](/ja-jp/services/xbox-services/multiplayer/mpsd/how-to/live-mpsd-howto-nav.md)
- [マルチプレイヤーの FAQ とトラブルシューティング](/ja-jp/services/xbox-services/multiplayer/mpsd/concepts/live-multiplayer-2015-faq.md)
- [マルチプレイヤーセッションのステータスコード](/ja-jp/services/xbox-services/multiplayer/mpsd/how-to/live-mpsd-status-codes.md)
- [クイックスタート (Windows) - Party とマルチプレイヤー](/ja-jp/services/playfab/sdks/unified-sdk/quickstart-windows-party.md)
- [マルチプレイヤー](/ja-jp/services/xbox-services/multiplayer/index.md)
