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

# Multiplayer Manager を使用してフレンドとマルチプレイヤーをプレイする

> Multiplayer Manager を使用してロビー セッションを初期化し、XBOX Live 招待を送信して、フレンドが進行中のゲームに参加できるようにする手順ガイド。

<a id="top" />

シンプルなマルチプレイヤー シナリオでは、ゲームのプレイヤーがフレンドとオンラインでプレイできます。このトピックでは、Multiplayer Manager を使用してこのシナリオをサポートするために実装する必要のある基本的な手順について説明します。

## 招待の送信と承諾の手順

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

1. [Multiplayer Manager を初期化する](#initialize-multiplayer-manager)
2. [ローカル ユーザーを追加してロビー セッションを作成する](#create-lobby)
3. [フレンドに招待を送信する](#send-invites)
4. [招待を承諾する](#accept-invites)
5. [ロビーからゲーム セッションに参加する](#join-game)

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

詳細については、[フレンドとゲームをプレイする (フローチャート)](/services/xbox-services/multiplayer/mpm/concepts/flowcharts/live-mpm-play-with-friends) を参照してください。

## 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 は、フレンドが参加できるようにシェルにロビーを広告します。
ローカル ユーザーを追加した後にのみ、招待の送信、ロビー プロパティの設定、および `lobby()` を介したロビー メンバーへのアクセスが可能です。

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

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

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

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

#### フラット 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 を介してフレンドのゲームに参加したりすると、そのデバイス上でゲームが起動されます。

Microsoft Game Development Kit (GDK) ベースのゲームでは、ゲームの開始後に [XGameActivationRegisterForEvent](/reference/system/xgameactivation/functions/xgameactivationregisterforevent) を呼び出して招待イベントをリッスンします。

XBOX One Software Development Kit および Universal Windows Platform (UWP) ベースのゲームでは、ゲームの開始後、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}

void CALLBACK MyXGameInviteEventCallback(
    _In_opt_ void* context,
    _In_ const XGameActivationInfo* activationInfo)
{
    UNREFERENCED_PARAMETER(context);
    if (activationInfo->type == XGameActivationType::AcceptedGameInvite)
    {
        if (activationInfo->inviteUri != nullptr)
        {
            std::string inviteString(activationInfo->inviteUri);
            auto pos = inviteString.find("handle=");
            auto inviteHandleId = inviteString.substr(pos + 7, 36);

            // Now use inviteHandleId when calling XblMultiplayerManagerJoinLobby().  
            // See the example call as follows.
        }
    }
}

XTaskQueueRegistrationToken token = { 0 };
HRESULT hr = XGameActivationRegisterForEvent(
    queue,
    nullptr,
    MyXGameInviteEventCallback,
    &token);

```

```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 をアップロードする。
* メンバー プロパティを設定する。
* セッション変更イベントに登録する。
* ロビー セッションをアクティブなセッションとして設定する。
* ゲーム セッションに参加する (存在する場合)。
* 転送ハンドルを使用する。

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

## ロビーからゲーム セッションに参加する <a id="join-game" />

招待が承諾され、ホストがゲームを開始する準備ができたら、[XblMultiplayerManagerJoinGameFromLobby](/reference/live/xsapi-c/multiplayer_manager_c/functions/xblmultiplayermanagerjoingamefromlobby) を呼び出すことにより、ロビー セッションのメンバーを含む新しいゲームを開始できます。

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

#### フラット C API

```cpp theme={null}
HRESULT hr = XblMultiplayerManagerJoinGameFromLobby(gameSessionTemplateName);
if (!SUCCEEDED(hr))
{
    // Handle error.
}
```

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

Multiplayer Manager は、ロビーからゲーム セッションに参加するために以下の機能を実行します。

* ゲーム セッションを作成する。
* すべてのローカル プレイヤーをアクティブとして参加させる。
* SDA をアップロードする。
* メンバー プロパティを設定する。
* セッション変更イベントに登録する。
* ロビー セッションを介してゲームを広告する。

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


## Related topics

- [フレンドとゲームをプレイする (フローチャート)](/ja-jp/services/xbox-services/multiplayer/mpm/concepts/flowcharts/live-mpm-play-with-friends.md)
- [Multiplayer Manager のサンプル コード](/ja-jp/services/xbox-services/multiplayer/mpm/how-to/live-mm-howto-nav.md)
- [一般的なマルチプレイヤー シナリオ](/ja-jp/services/xbox-services/multiplayer/overviews/live-common-multiplayer-scenarios.md)
- [Multiplayer Manager を使用してゲーム招待を送信する](/ja-jp/services/xbox-services/multiplayer/mpm/how-to/live-send-game-invites.md)
- [SmartMatch と MPM によるマルチプレイヤー マッチメイキング](/ja-jp/services/xbox-services/multiplayer/mpm/how-to/live-play-multiplayer-with-matchmaking.md)
