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

# SmartMatch と MPM によるマルチプレイヤー マッチメイキング

> Multiplayer Manager と SmartMatch マッチメイキングを使用して、XBOX Live プレイヤーを見つけ、ロビー セッションを作成し、オプションの招待を送信し、マルチプレイヤー マッチを開始します。

<a id="top" />

このトピックでは、Multiplayer Manager を使用して SmartMatch マッチメイキングを実装するために必要な基本的な手順について説明します。

プレイヤーがゲームをプレイしたいときにオンラインのフレンドが十分にいない場合や、単にオンラインでランダムなプレイヤーと対戦したいだけの場合があります。
SmartMatch サービスを使用して、他の XBOX プレイヤーを見つけることができます。

## マッチを見つける

以下の手順では、Multiplayer Manager を使用してプレイヤーのフレンドに招待を送信し、そのフレンドが進行中のゲームに参加できるようにします。

1. [Multiplayer Manager を初期化する](#initialize-multiplayer-manager)
2. [ローカル ユーザーを追加してロビー セッションを作成する](#create-lobby)
3. [フレンドに招待を送信する (オプション)](#send-invites)
4. [招待を承諾する (オプション)](#accept-invites)
5. [マッチを見つける](#find-match)

手順 1、2、3、および 5 は、招待を実行するデバイスで行います。
手順 4 は通常、プロトコル アクティベーションによるアプリ起動の後、招待された側のデバイスで開始されます。

詳細については、[SmartMatch マッチメイキングを使用してゲームをプレイする (フローチャート)](/services/xbox-services/multiplayer/mpm/concepts/flowcharts/live-mpm-play-with-smartmatch-matchmaking) を参照してください。

## Multiplayer Manager を初期化する <a id="initialize-multiplayer-manager" />

ロビー セッション オブジェクトは、有効なセッション テンプレート名で Multiplayer Manager が初期化されると自動的に作成されます。セッション テンプレートはサービス構成で定義されます。

<Note>サービス上のロビー セッション インスタンスは、ユーザーが追加されるまで作成されません。</Note>

### フラット C API

```cpp theme={null}
HRESULT hr = XblMultiplayerManagerInitialize(lobbySessionTemplateName, queueUsedByMultiplayerManager);
```

詳細については、[XblMultiplayerManagerInitialize](/reference/live/xsapi-c/multiplayer_manager_c/functions/xblmultiplayermanagerinitialize) を参照してください。

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

## ローカル ユーザーを追加してロビー セッションを作成する<a id="create-lobby" />

ローカルでサインインしている XBOX services ユーザーをロビー セッションに追加します。
最初のユーザーが追加されると新しいロビーがホストされます。
それ以外のすべてのユーザーは、既存のロビーにセカンダリ ユーザーとして追加されます。

Multiplayer Manager は、フレンドが参加できるようにシェルにロビーを広告します。
ローカル ユーザーを追加した後にのみ、招待の送信、ロビー プロパティの設定、およびロビー メンバーへのアクセスが可能です。

ローカル ユーザーがロビーに参加するとき、その接続アドレスとカスタム プロパティを設定することをお勧めします。

このプロセスは、ローカルでサインインしているすべてのユーザーに対して繰り返す必要があります。

### 単一のローカル ユーザーの追加

#### フラット C API

```cpp theme={null}
HRESULT hr = XblMultiplayerManagerLobbySessionAddLocalUser(xblUserHandle);

if (!SUCCEEDED(hr))
{
    // Handle failure.
}

// Set member connection address.
const char* connectionAddress = "1.1.1.1";
hr = XblMultiplayerManagerLobbySessionSetLocalMemberConnectionAddress(
    xblUserHandle, connectionAddress, context);

if (!SUCCEEDED(hr))
{
    // Handle failure.
}

// Set custom member properties.
const char* propName = "Name";
const char* propValueJson = "{}";
hr = XblMultiplayerManagerLobbySessionSetProperties(propName, propValueJson, context);

if (!SUCCEEDED(hr))
{
    // Handle failure.
}
...
```

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

* [XblMultiplayerManagerLobbySessionAddLocalUser](/reference/live/xsapi-c/multiplayer_manager_c/functions/xblmultiplayermanagerlobbysessionaddlocaluser)
* [XblMultiplayerManagerLobbySessionSetLocalMemberConnectionAddress](/reference/live/xsapi-c/multiplayer_manager_c/functions/xblmultiplayermanagerlobbysessionsetlocalmemberconnectionaddress)
* [XblMultiplayerManagerLobbySessionSetProperties](/reference/live/xsapi-c/multiplayer_manager_c/functions/xblmultiplayermanagerlobbysessionsetproperties)

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

### 複数のローカル ユーザーの追加

#### フラット C API

```cpp theme={null}
std::vector<XblUserHandle> xblUsers;
for (XblUserHandle xblUserHandle : xblUsers)
{
    HRESULT hr = XblMultiplayerManagerLobbySessionAddLocalUser(xblUserHandle);

    if (!SUCCEEDED(hr))
    {
        // Handle failure.
    }

    // Set member connection address.
    const char* connectionAddress = "1.1.1.1";
    hr = XblMultiplayerManagerLobbySessionSetLocalMemberConnectionAddress(
        xblUserHandle, connectionAddress, context);

    if (!SUCCEEDED(hr))
    {
        // Handle failure.
    }

    // Set custom member properties.
    const char* propName = "Name";
    const char* propValueJson = "{}";
    hr = XblMultiplayerManagerLobbySessionSetProperties(propName, propValueJson, context);
    ...
}
```

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

* [XblMultiplayerManagerLobbySessionAddLocalUser](/reference/live/xsapi-c/multiplayer_manager_c/functions/xblmultiplayermanagerlobbysessionaddlocaluser)
* [XblMultiplayerManagerLobbySessionSetLocalMemberConnectionAddress](/reference/live/xsapi-c/multiplayer_manager_c/functions/xblmultiplayermanagerlobbysessionsetlocalmemberconnectionaddress)
* [XblMultiplayerManagerLobbySessionSetProperties](/reference/live/xsapi-c/multiplayer_manager_c/functions/xblmultiplayermanagerlobbysessionsetproperties)

変更は次の [XblMultiplayerManagerDoWork](/reference/live/xsapi-c/multiplayer_manager_c/functions/xblmultiplayermanagerdowork) 呼び出しでバッチ処理されます。
Multiplayer Manager は、ローカル ユーザーがロビー セッションに追加されるたびに [XblMultiplayerEventType](/reference/live/xsapi-c/multiplayer_manager_c/enums/xblmultiplayereventtype)`::UserAdded` イベントを発生させます。

そのユーザーが正常に追加されたかどうかを確認するために、イベントのエラー コードをチェックすることをお勧めします。
失敗した場合は、エラー メッセージが失敗の原因の詳細を提供します。

Multiplayer Manager は、ローカル ユーザーを追加してロビー セッションを作成するために以下の機能を実行します。

* XBOX services マルチプレイヤー サービスに Real Time-Activity およびマルチプレイヤー サブスクリプションを登録する。
* ロビー セッションを作成する。
* すべてのローカル プレイヤーをアクティブとして参加させる。
* セキュア デバイス アドレス (SDA) をアップロードする。
* メンバー プロパティを設定する。
* セッション変更イベントに登録する。
* ロビー セッションをアクティブなセッションとして設定する。

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

## フレンドに招待を送信する (オプション) <a id="send-invites" />

プレイヤーがゲームに招待するフレンドまたは最近のプレイヤーを選択できる、標準の XBOX UI を表示します。
プレイヤーが選択を確定すると、Multiplayer Manager は選択されたプレイヤーに招待を送信します。

ゲームは、[XblMultiplayerManagerLobbySessionInviteUsers](/reference/live/xsapi-c/multiplayer_manager_c/functions/xblmultiplayermanagerlobbysessioninviteusers) メソッドを使用して、XBOX services ユーザー ID で定義されたプレイヤーの集合に招待を送信することもできます。
このメソッドは、標準の XBOX UI ではなく独自のゲーム内 UI を使用する場合に便利です。

#### フラット C API

```cpp theme={null}
size_t xuidsCount = 1;
uint64_t xuids[1] = {};
xuids[0] = 1234567891234567;
HRESULT hr = XblMultiplayerManagerLobbySessionInviteUsers(
    xblUserHandle, 
    xuids, 
    xuidsCount, 
    nullptr,    // ContextStringId 
    nullptr     // CustomActivationContext
);
```

詳細については、[XblMultiplayerManagerLobbySessionInviteUsers](/reference/live/xsapi-c/multiplayer_manager_c/functions/xblmultiplayermanagerlobbysessioninviteusers) を参照してください。

Multiplayer Manager は、フレンドに招待を送信するために以下の機能を実行します。

* XBOX 標準のタイトル呼び出し可能 UI (TCUI) を表示する
* 選択されたプレイヤーに直接招待を送信する

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

## 招待を承諾する (オプション) <a id="accept-invites" />

招待されたプレイヤーがゲーム招待を承諾したり、シェル UI を介してフレンドのゲームに参加したりすると、プロトコル アクティベーションを使用してそのデバイス上でゲームが起動されます。
ゲームの開始後、Multiplayer Manager はプロトコル アクティベーション イベント引数を使用してロビーに参加できます。

招待されたユーザーが [XblMultiplayerManagerLobbySessionAddLocalUser](/reference/live/xsapi-c/multiplayer_manager_c/functions/xblmultiplayermanagerlobbysessionaddlocaluser) を介して追加されていない場合、[XblMultiplayerManagerJoinLobby](/reference/live/xsapi-c/multiplayer_manager_c/functions/xblmultiplayermanagerjoinlobby) は失敗し、`JoinLobbyCompleted` イベントで [XblMultiplayerEventArgsXuid](/reference/live/xsapi-c/multiplayer_manager_c/functions/xblmultiplayereventargsxuid) を呼び出すことにより、招待が送信された対象の xuid を提供します。

ロビーに参加した後、ローカル メンバーの接続アドレスとメンバーのカスタム プロパティを設定することをお勧めします。
また、ホストが存在しない場合は、[XblMultiplayerManagerLobbySessionSetSynchronizedHost](/reference/live/xsapi-c/multiplayer_manager_c/functions/xblmultiplayermanagerlobbysessionsetsynchronizedhost) を介してホストを設定することもできます。

最後に、既にゲームが進行中で、招待されたユーザーのためのスペースがある場合、Multiplayer Manager はユーザーをゲーム セッションに自動参加させます。
タイトルは `JoinGameCompleted` イベントを通じて通知され、適切なエラー コードとメッセージが提供されます。

エラーまたは成功の結果は、`JoinLobbyCompleted` イベントを介して処理されます。

#### フラット C API

```cpp theme={null}
HRESULT hr = XblMultiplayerManagerJoinLobby(inviteHandleId, xblUserHandle);
if (!SUCCEEDED(hr))
{
    // Handle failure.
}

// Set member connection address.
const char* connectionAddress = "1.1.1.1";
hr = XblMultiplayerManagerLobbySessionSetLocalMemberConnectionAddress(
    xblUserHandle, connectionAddress, context);
```

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

* [XblMultiplayerManagerJoinLobby](/reference/live/xsapi-c/multiplayer_manager_c/functions/xblmultiplayermanagerjoinlobby)
* [XblMultiplayerManagerLobbySessionSetLocalMemberConnectionAddress](/reference/live/xsapi-c/multiplayer_manager_c/functions/xblmultiplayermanagerlobbysessionsetlocalmemberconnectionaddress)

Multiplayer Manager は、招待を承諾するために以下の機能を実行します。

* Real-Time Activity およびマルチプレイヤー サブスクリプションを登録する。
* ロビー セッションに参加する。
* 既存のロビー状態のクリーンアップ。
* すべてのローカル プレイヤーをアクティブとして参加させる。
* SDA をアップロードする。
* メンバー プロパティを設定する。
* セッション変更イベントに登録する。
* ロビー セッションをアクティブなセッションとして設定する。
* ゲーム セッションに参加する (存在する場合)。
* 転送ハンドルを使用する。

### マッチを見つける <a id="find-match" />

招待が承諾され、ホストがゲームを開始する準備ができたら、SmartMatch を使用して以下のいずれかを実行できます。

* [XblMultiplayerManagerFindMatch](/reference/live/xsapi-c/multiplayer_manager_c/functions/xblmultiplayermanagerfindmatch) を呼び出すことにより、ロビー セッションのすべてのメンバーに対して十分な空きプレイヤー スロットを持つ既存のゲームを見つけます。
* [XblMultiplayerManagerJoinGameFromLobby](/reference/live/xsapi-c/multiplayer_manager_c/functions/xblmultiplayermanagerjoingamefromlobby) の後に [XblMultiplayerManagerAutoFillMembersDuringMatchmaking](/reference/live/xsapi-c/multiplayer_manager_c/functions/xblmultiplayermanagerautofillmembersduringmatchmaking) を呼び出すことにより、ロビー セッションのすべてのメンバーを含む新しいゲーム セッションを作成し、同じゲーム タイプのマッチを探している他のプレイヤーで空きスロットを埋めます。

[XblMultiplayerManagerFindMatch](/reference/live/xsapi-c/multiplayer_manager_c/functions/xblmultiplayermanagerfindmatch) を呼び出す前に、まずサービス構成でホッパーを構成する必要があります。
ホッパーは、SmartMatch がプレイヤーをマッチングするために使用するルールを定義します。

#### フラット C API

```cpp theme={null}
uint32_t timeoutInSeconds = 30;
HRESULT hr = XblMultiplayerManagerFindMatch(hopperName, attributesJson, timeoutInSeconds);
if (!SUCCEEDED(hr))
{
    // Handle failure.
}
```

詳細については、[XblMultiplayerManagerFindMatch](/reference/live/xsapi-c/multiplayer_manager_c/functions/xblmultiplayermanagerfindmatch) を参照してください。

Multiplayer Manager は、マッチを見つけるために以下の機能を実行します。

* マッチ チケットを作成する。
* すべての Quality of Service (QoS) ステージを処理する。
* ロスター変更を処理する。
* 再送信する (必要な場合)。
* ターゲット ゲーム セッションに参加する。
* ロビー セッションを介してゲームを広告する。

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


## Related topics

- [SmartMatch マッチメイキングを使用してゲームをプレイする (フローチャート)](/ja-jp/services/xbox-services/multiplayer/mpm/concepts/flowcharts/live-mpm-play-with-smartmatch-matchmaking.md)
- [SmartMatch マッチメイキング](/ja-jp/services/xbox-services/multiplayer/matchmaking/live-matchmaking-nav.md)
- [マッチメイキング](/ja-jp/services/xbox-services/multiplayer/matchmaking/index.md)
- [SmartMatch マッチメイキングの使用](/ja-jp/services/xbox-services/multiplayer/matchmaking/concepts/live-matchmaking-how-tos.md)
- [マッチメイキング ポータルの構成](/ja-jp/services/xbox-services/multiplayer/matchmaking/config/live-matchmaking-config-nav.md)
