Multiplayer Manager を使ったフレンドとのマルチプレイヤー ゲームのプレイの有効化
シンプルなマルチプレイヤーのシナリオでは、ゲームのプレイヤーがフレンドとオンラインでプレイすることができます。 このトピックでは、Multiplayer Manager を使用してこのシナリオをサポートするために実装する必要のある基本的な手順について説明します。
招待を送ったり受け取ったりする手順
Multiplayer Manager を使用してユーザーのフレンドに招待を送信し、そのフレンドが進行中のゲームに参加するには、次の手順のようにします。
- Multiplayer Manager を初期化する
- ローカル ユーザーを追加することでロビー セッションを作成する
- フレンドに招待を送信する
- 招待を受け入れる
- ロビーからゲーム セッションに参加する
手順 1、2、3、5 は、招待を実行したデバイス上で行います。 手順 4 は通常、プロトコルのアクティブ化によるアプリ起動の後、招待されたユーザーのデバイスで開始されます。
詳細については、「フレンドとゲームをプレイする (フローチャート)」をご覧ください。
Multiplayer Manager を初期化する
Multiplayer Manager が有効なセッション テンプレート名で初期化されると、ロビー セッション オブジェクトが自動的に作成されます。 セッション テンプレートはサービス構成でも定義されます。
注意
サービスのロビー セッション インスタンスは、ユーザーが追加されるまで作成されません。
フラット C API
HRESULT hr = XblMultiplayerManagerInitialize(lobbySessionTemplateName, queueUsedByMultiplayerManager);
詳細については、XblMultiplayerManagerInitialize をご覧ください。
ローカル ユーザーを追加することでロビー セッションを作成する
ローカルでサインインしている Xbox サービス ユーザーをロビー セッションに追加します。 最初のユーザーが追加されたときに新しいロビーがホストされます。 他のすべてのユーザーは、セカンダリー ユーザーとして既存のロビーに追加されます。
Multiplayer Manager は、フレンドが参加するシェルのロビーも公開します。
lobby()
を介した招待の送信、ロビーのプロパティの設定、ロビー メンバーへのアクセスは、ローカル ユーザーの追加後にのみ可能です。
ローカル ユーザーがロビーに参加するときは、接続アドレスとカスタム プロパティを設定することをお勧めします。
ローカルにサインインしたすべてのユーザーに対して、このプロセスを繰り返す必要があります。
1 人のローカル ユーザーを追加する
フラット C API
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
- XblMultiplayerManagerLobbySessionSetLocalMemberConnectionAddress
- XblMultiplayerManagerLobbySessionSetProperties
複数のローカル ユーザーを追加する
フラット C API
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
- XblMultiplayerManagerLobbySessionSetLocalMemberConnectionAddress
- XblMultiplayerManagerLobbySessionSetProperties
変更は、次の XblMultiplayerManagerDoWork 呼び出しでバッチ処理されます。 ユーザーがロビー セッションに追加されるたびに、Multiplayer Manager により XblMultiplayerEventType:: UserAdded イベントが発生します。
イベントのエラー コードを調べて、そのユーザーが正常に追加されたかどうかを確認することをお勧めします。 障害が発生した場合は、障害の詳細な理由がエラー メッセージで提供されます。
Multiplayer Manager は、ローカル ユーザーを追加してロビー セッションを作成するために、次の機能を実行します。
- リアルタイム アクティビティおよびマルチプレイヤーのサブスクリプションを Xbox サービス マルチプレイヤー サービスに登録します。
- ローカル ユーザーを追加することでロビー セッションを作成します。
- すべてのローカル プレイヤーをアクティブとして参加させます。
- セキュリティで保護されたデバイスのアドレス (SDA) をアップロードします。
- メンバーのプロパティを設定します。
- セッション変更イベントに登録します。
- ロビー セッションをアクティブ セッションとして設定します。
フレンドに招待を送信する
標準 Xbox UI を表示して、プレイヤーはフレンドや最近遊んだプレイヤーを選んでゲームに招待できるようにします。 プレーヤーが選択を確認すると、Multiplayer Manager は選択したプレイヤーに招待を送信します。
また、ゲームでは XblMultiplayerManagerLobbySessionInviteUsers 方式を使用して、Xbox サービス ユーザー ID によって定義された一連のユーザーに招待を送信することもできます。 この方式は、ストック Xbox UI の代わりに独自のゲーム内 UI を使用したい場合に役立ちます。
フラット C API
size_t xuidsCount = 1;
uint64_t xuids[1] = {};
xuids[0] = 1234567891234567;
HRESULT hr = XblMultiplayerManagerLobbySessionInviteUsers(
xblUserHandle,
xuids,
xuidsCount,
nullptr, // ContextStringId
nullptr // CustomActivationContext
);
詳細については、XblMultiplayerManagerLobbySessionInviteUsers をご覧ください。
Multiplayer Manager は、フレンドに招待を送信するために次の機能を実行します。
- Xbox 標準のタイトルが呼び出せる UI (TCUI) を表示する。
- 選択されたプレイヤーに直接、招待を送信する
招待を受け入れる
招待されたプレイヤーがゲームの招待を受け入れると、またはシェル UI でフレンドのゲームに参加すると、デバイスでゲームが起動されます。
Microsoft Game Development Kit (GDK) ベースのゲームでは、ゲームが開始されたら、XGameInviteRegisterForEventを呼び出して、イベント招待をリッスンします。
Xbox One ソフトウェア開発キットおよびユニバーサル Windows プラットフォーム (UWP) ベースのゲームでは、ゲームが開始したら、Multiplayer Manager はプロトコルがアクティブ化されたイベント引数を使用してロビーに参加できます。
招待されたユーザーが XblMultiplayerManagerLobbySessionAddLocalUser によって追加されていない場合 XblMultiplayerManagerJoinLobby はエラー終了し、JoinLobbyCompleted
イベントで XblMultiplayerEventArgsXuid を呼び出すことにより、招待の送信先の xuid を提供します。
ロビーに参加した後、ローカル メンバーの接続アドレスとメンバーのカスタム プロパティを設定することを推奨します。 ホストが存在しない場合は XblMultiplayerManagerLobbySessionSetSynchronizedHost 経由で設定することもできます。
最後に、ゲームが既に進行中であり、招待されたユーザーを受け入れる余裕がある場合、Multiplayer Manager はユーザーをゲーム セッションに自動的に参加させます。
タイトルには、適切なエラー コードとメッセージを提供する JoinGameCompleted
イベントによって通知されます。
エラーまたは成功の結果は、JoinLobbyCompleted
イベントを介して処理されます。
フラット C API
void CALLBACK MyXGameInviteEventCallback(
_In_opt_ void* context,
_In_ const char* inviteUri)
{
UNREFERENCED_PARAMETER(context);
if (inviteUri != nullptr)
{
std::string inviteString(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 = XGameInviteRegisterForEvent(
queue,
nullptr,
MyXGameInviteEventCallback,
&token);
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);
詳細については、以下を参照してください。
Multiplayer Manager は、招待を受け入れるために次の機能を実行します。
- リアルタイム アクティビティとマルチプレイヤー サブスクリプションを登録します。
- ロビー セッションに参加します。
- 既存のロビー状態のクリーンアップ。
- すべてのローカル プレイヤーをアクティブとして参加させます。
- SDA をアップロードします。
- メンバーのプロパティを設定します。
- セッション変更イベントに登録します。
- ロビー セッションをアクティブ セッションとして設定します。
- ゲーム セッションに参加します (存在する場合)。
- 転送ハンドルを使用します。
ロビーからゲーム セッションに参加する
招待が承諾され、ホストがゲームの再生を開始する準備ができたら、XblMultiplayerManagerJoinGameFromLobbyを呼び出すことで、ロビー セッションのメンバーを含む新しいゲームを開始できます。
エラーまたは成功の結果は、JoinGameCompleted
イベントを介して処理されます。
フラット C API
HRESULT hr = XblMultiplayerManagerJoinGameFromLobby(gameSessionTemplateName);
if (!SUCCEEDED(hr))
{
// Handle error.
}
詳細については、XblMultiplayerManagerJoinGameFromLobby をご覧ください。
Multiplayer Manager は、ロビーからゲーム セッションに参加するために次の機能を実行します。
- ゲーム セッションを作成します。
- すべてのローカル プレイヤーをアクティブとして参加させます。
- SDA をアップロードします。
- メンバーのプロパティを設定します。
- セッション変更イベントに登録します。
- ロビー セッションを介してゲームを公開します。