次の方法で共有


ユーザーと入力デバイス

ゲームは、どの入力デバイスが特定のユーザーに関連付けられているかを認識する必要があります。 これは、次の質問に答えるための重要なポイントです。

  • ゲームでアクションを行ったのは誰か?

  • 実績を達成したのは誰か?

  • 購入しているのは誰か?

このトピックでは、これらの関連付けを処理し、こうした質問に回答するための重要な概念を説明します。

Xbox One ERA および Microsoft Game Development Kit (GDK) とのユーザー モデルの違い

新しい Microsoft Game Development Kit (GDK) を開発する場合でも、Xbox One ERA から以前のタイトルを移植する場合でも、Xbox One ERA のユーザー モデルに慣れている場合、ユーザと入力デバイスの管理の実装がわかりにくい可能性があります。

  • セーブデータや実績が必要な場合など、ユーザーを必要とするタイトルについては、プライマリ ユーザーを確立する必要があります。 このプライマリ ユーザーはタイトルのみの構成であり、システムが提供するものではありません。

  • タイトルは XUserAddAsync の呼び出しを介して追加されたユーザーについてのみ認識します。 タイトルには、追加されていないユーザーに対してシステムが実行したアクションは通知されません。

  • 以前にタイトルのユーザーに関連付けられていたデバイスが、タイトルが認識していないユーザーに関連付けられた場合、タイトルには新しいユーザーなしでデバイス関連付けイベントのみが通知されます。

  • タイトルのユーザーに関連付けられなかったデバイスが、XUserAddAsync を使用して追加されなかった別のユーザーに関連付けられた場合、タイトルは関連付けイベントについて通知されません。

  • アカウントの選択画面は、それがどのように呼び出されたかに基づいて異なる動作をします (システム ガイド対 XUserAddAsync)。

注意

UserManagement サンプルは、さまざまなゲームの状況におけるユーザー管理と入力デバイスのペアリング動作をカバーしています。 また、ユーザーや入力デバイスに関連する XR の要件も処理します。 サンプルの詳細については、「Microsoft Game Development Kit のサンプル」を参照してください。

特定のユーザーを識別する方法

入力デバイスとやり取りするにはローカル ID を使用します。 ローカル ID は、ゲーム セッション内でユーザーのライフタイムに渡ってユーザーと共にある識別子です。 ローカル ID は、ゲームによって生成されるすべてのプロセスで、またはゲームが XLaunchNewGame を呼び出した場合に使用できます。 ゲーム セッションをまたいでユーザーを識別するためにローカル ID を使用しないでください。

ユーザーのローカル ID を取得するには、XUserGetLocalId 関数を使用します。

特定の入力デバイスを識別する方法

ゲームパッド、アーケード スティック、ハンドルなどのゲーム デバイスはすべて、APP_LOCAL_DEVICE_ID という構造で表される一意のデバイス ID を保持します。 このデバイス ID は、ゲームを何回起動しても、システムを何回再起動しても変わりません。 デバイス ID は、同じシステム上で実行されている 2 つの異なるゲーム間では異なります。

本体の XInput を使用している場合は、XInputGetDeviceId を使用してデバイス ID を取得できます。

GameInput を使用している場合は、IGameInputDevice::GetDeviceInfo の呼び出しから返される GameInputDeviceInfo オブジェクトの deviceId メンバーからデバイス ID を取得できます。

ユーザー モデル

セーブデータや実績が必要な場合など、タイトルにユーザーが必要な場合は、タイトルがプライマリ ユーザーの確立に完全に責任を持ちます。 複数のユーザーがサインインできるようにする場合であっても、このプライマリ ユーザーを維持する必要があります。 また、タイトルは必要に応じてプライマリ ユーザーを変更できるようにする必要があります。 これを行う方法としては、XUserAddAsync を使用してアカウントの選択画面を起動するユーザーの切り替えプロンプトを持たせることが挙げられます。

アカウントの選択画面には、本体にサインインしたことがあるすべてのユーザーが表示され、新しいアカウントでサインインするための [新規追加] ボタンがあり、一時的なゲスト ユーザーもサインインすることができます。 これらのユーザー アカウントは、そのユーザー本人であるかどうかに関係なく、誰でも選択できます。 この方法によって、ユーザーが自分以外のユーザーとしてプレイすることがシステムでサポートされています。

Microsoft Game Development Kit (GDK) タイトルには、システム上のユーザーについての完全な知識がありません。 代わりに、XUserAddAsync の呼び出しを介してのみ、ユーザーをタイトルに追加できます。 このようにして追加されたユーザーのみが、タイトルが操作できるユーザーとなります。 システムは、タイトルが追加していないユーザーに対して行われたアクションについては、タイトルに通知しません。 結果として、タイトルは独自のユーザー一覧を維持する必要があります。

アカウントの選択画面は、2 つの異なる方法で呼び出すことができます。システム ガイドから呼び出す方法と、XUserAddAsync を介して呼び出す方法です。 この選択画面の挙動は、これら 2 つの状況下で異なります。

ケース XUserAddAsync アカウントの選択画面 アカウントの選択画面をガイドする
タイトルにサインインしていないユーザーの選択 ユーザーはシステムとタイトルの両方にサインインした状態になります。 ユーザーは、システムにのみサインインした状態になります。 タイトルはサインインを通知されません。
タイトルにすでにサインインしているユーザーの選択 ユーザーはすでにタイトルにサインインしているので、これ以降のユーザーの状態の変更は発生しません。 ユーザーはすでにタイトルにサインインしているので、これ以降のユーザーの状態の変更は発生しません。

注意

タイトルにサインインしたユーザーのセットは、常にシステムにサインインしたユーザーのサブセットです。 タイトルには、システムにサインインしていないユーザーをサインインさせることはできません。 ただし、システムはタイトルが認識していないユーザーを受け入れることができます。

ユーザー イベントは、XUserRegisterForChangeEvent を使用して登録された XUserChangeEventCallback を介して処理することができます。 イベントは、XUserAddAsync を使用してサインインしたユーザーに対してのみ呼び出されます。 ユーザーがシステムからサインアウトした場合、タイトルはそれに応じて対応し、ユーザーをタイトルから削除するか、プレーヤーがもう一度ユーザーにサインインを試みることを許可する必要があります。

デバイスの関連付けを入力する

Microsoft Game Development Kit (GDK) は、ユーザーが任意の数の入力デバイスを関連付けられるようにします。 これは、ユーザーとデバイスの間での 1:1 マッピングを想定する古いタイトルを移植する場合には、大変な努力を必要とする可能性があります。

デバイスの関連付けは通常、アカウントの選択画面を介して行われます。 UI からユーザーを選択した入力デバイスは、そのユーザーに関連付けられた状態になります。 ユーザーがサインアウトした場合や、XUserAddAsyncAddDefaultUserSilentlyAddDefaultUserAllowingUI オプションを介して UI なしで使用された場合など、他のケースからも関連付けを変更することができます。

アカウントの選択画面は関連付けに対しても、選択画面がどのように呼び出されたかに基づいて異なる動作をします。

ケース XUserAddAsync アカウントの選択画面 アカウントの選択画面をガイドする
タイトルにサインインしていないユーザーの選択 ユーザーがタイトルにサインインすると、プロンプトを完了したデバイスがユーザーに関連付けられます。 ユーザーはシステムにサインインしており (まだサインインしていない場合)、プロンプトを完了したデバイスはそのユーザーに関連付けられます。 タイトルはこのユーザーを認識していないので、デバイスが関連付けられていないことがタイトルに通知されます。
タイトルにすでにサインインしているユーザーの選択 プロンプトを完了したデバイスは、システムのユーザーとタイトルのユーザーに関連付けられます。 プロンプトを完了したデバイスは、システムのユーザーとタイトルのユーザーに関連付けられます。

AddDefaultUserSilently オプションまたは AddDefaultUserAllowingUI オプションのいずれかを使用して XUserAddAsync を呼び出し、アカウントの選択画面なしでタイトルに自動的にサインインした場合、システムが持っていた入力デバイスのペアリングは、タイトルに伝達されます。

ユーザー デバイスの関連付けの変更を通知するには、XUserRegisterForDeviceAssociationChanged メソッドを使用して XUserDeviceAssociationChangedCallback コールバックを登録することができます。 また、XUserFindForDevice を呼び出して、特定のデバイスの関連付けを検索することもできます。

注意

タイトルは XUserAddAsync を使用して追加されたユーザーのみを認識することができるので、ユーザー デバイスの関連付けのコールバックとメソッドは、タイトルが以前に追加したユーザーのみを返すことができます。

ユーザーと既定のオーディオ エンドポイントのマッチング

ゲームではヘッドセットやマイクをよく使用します。 確認すべき重要な質問を次に示します。

  • ユーザーはヘッドセットを持っていますか? 持っている場合、どのヘッドセットを使用していると思いますか? 既定の通信レンダリング オーディオ エンドポイントは何ですか?

  • それに対応するマイクをユーザーは持っていますか? 既定の通信キャプチャ エンドポイントは何ですか?

特定のユーザーに関するこれらの質問に答えるために、ゲームは XUserGetDefaultAudioEndpointUtf16 を呼び出すことができます。 ユーザーとデバイスの関連付けが変更可能であることと同様に、特定のユーザーに関連付けられた既定のオーディオ エンドポイントも変更可能です。 そのような関連付けの変化を検出するために、ゲームは XUserRegisterForDefaultAudioEndpointUtf16Changed を呼び出す必要があり、結果のコールバックに注意する必要があります。