次の方法で共有


Multiplayer Manager の概要

このトピックでは、セッション、マッチメイキング、ゲームへの招待を管理することで、マルチプレイヤー機能を追加するための高レベル API について説明します。 このAPI は、状態ベースおよびイベント ベースのプログラミング モデルを提供します。

Xbox サービスでは、世界中の Xbox メンバーに接続できるように、タイトルにマルチプレイヤー機能を追加するための広範なサポートを提供します。 これには、多様なマッチメイキング シナリオや、進行中のフレンドのゲームにプレイヤーが参加する機能などが含まれます。

マルチプレイヤー API を直接使用して Xbox サービス マルチプレイヤーを実装することは、複雑な作業になる可能性があります。 ベスト プラクティスに従っており、認定要件を満たしていることを確認するには、高度な設計とテストが必要です。

Multiplayer Manager を使用すると、セッションとマッチメイキングを管理し、状態ベースとイベント ベースのプログラミング モデルの提供により、ゲームにマルチプレイヤー機能を簡単に追加できます。

Multiplayer Manager は 一連の API です。 これらは、ビア ホスト型のマルチプレイヤー デザインを使用して、Xbox サービス ゲームのマルチプレイヤー シナリオを簡単に実装するために設計されています。

Multiplayer Manager では、フレンドとのマルチプレイヤー ゲームのプレイ、ゲームへの招待の処理、途中参加の処理、マッチメイキングなどの一般的なマルチプレイヤー シナリオを念頭に置いて設計された API が提供されます。

Multiplayer Manage は、複数のローカル ユーザーをサポートします。 また、サードパーティーのマッチメイキング サービスを使用する場合に、タイトルを容易にマルチプレイヤー セッション ディレクトリ (MPSD) と統合できるようになっています。 これらのシナリオの多くは、わずか数回の API 呼び出しで実現できます。

主な機能

Multiplayer Manager API の主な機能を次に示します。

  • 簡単なセッション管理と Xbox サービス マッチメイキング
  • 状態ベースとイベント ベースのプログラミング モデル
  • Xbox サービス のベスト プラクティスおよびマルチプレイヤー XR への準拠。
  • マルチプレイヤー 2015 のフローチャートの実装

Multiplayer Manager API の設計に関する重要な情報は次のとおりです。

Important

認定に合格するためには、オンライン マルチプレイヤーのために必要なイベントをゲームに実装する必要があることに変更はありません。

概要

Multiplayer Manager は、次の重要な概念を中心としています。

  • ロビー セッション: デバイスのローカル ユーザーと一緒にプレイしたい招待された友達を管理するために使用される永続セッション。

    グループは例として、複数のラウンド、マップ、レベルなどのゲームをすることがあります。 ロビー セッションはこのフレンドのコア グループ (デバイスにローカルのプレイヤーを含む) を追跡します。 一般に、このグループは、ホストがメニューを移動し、グループ メンバーとチャットしてどのゲーム モードをプレイするかを決めるときに形成されます。

  • ゲーム セッション: ゲームの特定のインスタンスをプレイしているプレイヤーを追跡します。

    たとえば、レース、マップ、レベルです。 ロビーセッションのメンバーを含む XblMultiplayerManagerJoinGameFromLobby を使用して、新しいゲームセッションを作成できます。

    メンバーが招待を受け入れると、メンバーはロビーおよびゲーム セッションに追加されます (空きがある場合)。

    マッチメイキングが有効になっている場合はゲーム セッションに他のプレイヤーを追加できますが、それらの追加プレイヤーはロビー セッションには追加されません。 これは、ゲームが終了したときに、ロビー セッション内のプレイヤーはまだ一緒にいますが、マッチメイキングからの追加プレイヤーはそうではないことを意味します。

  • XblMultiplayerManagerMember: ローカルまたはリモート デバイスでサインインしている個々のユーザーを表します。

  • XblMultiplayerManagerDoWork: タイトルと Xbox サービス マルチプレイヤー サービスとの間でゲームの状態を適切に保つ更新が維持されるようにします。

    確実に最適なパフォーマンスを実行するには、XblMultiplayerManagerDoWork を頻繁に呼び出す必要があります (フレームごとに 1 回など)。

    XblMultiplayerManagerDoWork には、扱うゲームに対する XblMultiplayerEvent コールバック イベントの配列が用意されています。

ステート マシン

最新の状態にするには、XblMultiplayerManagerDoWork 呼び出しが必要です。 Multiplayer Manager が作業を行うには、定期的に XblMultiplayerManagerDoWork メソッドを呼び出す必要があります。 これを行う最も信頼性の高い方法は、フレームごとに少なくとも 1 回呼び出すことです。

XblMultiplayerManagerDoWork は、作業を行わない場合、すぐに返されるため、それほど頻繁に呼び出す必要はありません。

スレッド

Multiplayer Manager API によって返されるすべてのオブジェクトは、スレッドセーフであると見なしてはなりません。 ただし、複数のスレッドから呼び出す場合は、スレッドの同期の実行を制御できます。

ライブラリには内部マルチスレッド保護機能があります。 しかし、値にアクセスするために 1 つのスレッドが必要な場合は、独自のロックを実装する必要があります。たとえば、別のスレッドが XblMultiplayerManagerDoWorkを呼び出している間にメンバー リストをウォークする 場合などです。

状態に基づくモデルの更新

Multiplayer Manager は、状態に基づくモデルを管理し、プレイヤーの参加、退出、またはセッションの更新が発生するとバックグラウンドでセッションを更新します。 UI スレッドとゲーム スレッドの間のスレッド同期の問題を回避するために、Multiplayer Manager は、XblMultiplayerManagerDoWork メソッドを呼び出すまで、セッションのアプリの表示状態を更新しません。

従来は、セッションの変更などのイベントに関する通知をバックグラウンド スレッドで受信してから UI スレッドと同期し、それらの変更を表示する必要がありました。 Multiplayer Manager では、このバックグラウンド処理は自動的に行われます。

選択した時点でメインスレッドの XblMultiplayerManagerDoWorkを呼び出すことができます。これにより、Multiplayer Manager がバックグラウンドでバッファリングしている状態の最新のスナップショットを取得できます。

イベントと通知

Multiplayer Manager は、一連の重要なイベントを定義し (XblMultiplayerEvent)、発生した場合は XblMultiplayerManagerDoWork を使用してタイトルに通知します。 たとえば、イベントには、リモート プレーヤーの参加または退出、メンバーのプロパティ変更、セッション状態の変更が含まれます。

すべての Multiplayer Manager API は非同期です。 XblMultiplayerManagerDoWork メソッドは、これらの非同期操作が完了したときにイベントのリストを返します。 タイトルは、状況に応じてこれらのイベントを適切に処理する必要があります。 詳細については、XblMultiplayerEvent クラス説明書を参照してください。

返された XblMultiplayerEvent にはそれぞれ、イベントの種類に適した args を取得するために使用する必要のある EventArgsHandleが含まれます。 たとえば、の XblMultiplayerEventTypeMemberJoinedの場合は、XblMultiplayerEventArgsMembersCountXblMultiplayerEventArgsMembersに呼び出すことができます。

次の例では、XblMultiplayerManagerDoWork を使用してイベントを処理する方法を示します。

フラット C API

size_t eventCount{ 0 };
const XblMultiplayerEvent* events{ nullptr };
HRESULT hr = XblMultiplayerManagerDoWork(&events, &eventCount);
if (FAILED(hr))
{
    // Handle failure.
}

for (auto i = 0u; i < eventCount; ++i)
{
    switch (events[i].EventType)
    {
        case XblMultiplayerEventType::MemberJoined:
        {
            // Handle MemberJoined.
            size_t memberCount = 0;
            hr = XblMultiplayerEventArgsMembersCount(events[i].EventArgsHandle, &memberCount);
            assert(SUCCEEDED(hr));

            std::vector<XblMultiplayerManagerMember> members(memberCount);
            hr = XblMultiplayerEventArgsMembers(events[i].EventArgsHandle, memberCount, members.data());
            assert(SUCCEEDED(hr));
            ...

            break;
        }

        case XblMultiplayerEventType::SessionPropertyChanged:
        {
            // Handle SessionPropertyChanged.
            const char* changedProperty{ nullptr };
            hr = XblMultiplayerEventArgsPropertiesJson(events[i].EventArgsHandle, &changedProperty);
            assert(SUCCEEDED(hr));
            ...

            break;
        }
        ...
    }
}

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

シナリオ

このセクションでは、いくつかの一般的なシナリオと、各シナリオで呼び出すことがある API を紹介します。 Multiplayer Manager がバックグラウンドで行っていることについても説明しています。

API の概要の概要については、「Multiplayer Manager 管理 API の概要」を参照してください。

Multiplayer Manager でサポートされないこと

Multiplayer Manager によってマルチプレイヤー シナリオの実装は大幅に容易になり、開発者からのデータの一部が抽象化されます。 ただし、Multiplayer Manager が処理できないことがいくつかあります。

  • 大規模 マルチプレイヤー オンライン (MMO) ゲームや、大規模なセッション (1 セッションに 100 人以上のプレイヤー) を必要とするその他のゲーム タイプなどの永続的なオンライン サーバー ゲーム
  • サーバー間のセッション管理
  • きめ細かなレート制限に準拠した MPSD 呼び出しの調整
  • マルチプレイヤー サービス API と Multiplayer Manager API の混在

注意

Multiplayer Manager は特定のネットワーク技術に縛られず、どのネットワーク通信レイヤーでも機能する必要があります。

リソース

API の動作例については、 NetRumble サンプルに関するページを参照してください。

API の詳細については、multiplayer_manager_cを参照してください。 multiplayer_manager_c.hまた、ヘッダー ファイルを表示することができます。

Multiplayer Manager に関する質問やフィードバックや問題がある場合は、担当のベロッパー アカウント マネージャー (DAM) にお問い合わせいただくか、https://forums.xboxlive.com のフォーラムでサポートのためのスレッドを投稿してください。