ユーザー ID と XUser
Xbox One は、XUser
オブジェクトでゲームと対話しているユーザーの ID を管理します。 各 XUser
インスタンスは、ゲームにサインインしたユーザーを表します。 各ユーザーは、XUserHandle
によって表されます。 ゲームでは、XUserHandle
を使用して、次のようなことを行うことができます。
- Xbox サービスのサインイン状態をクエリする。
- ユーザーのゲーマータグをフェッチする。
- ユーザーのゲーマー アイコンをフェッチする。
- ユーザーの年齢グループを判別する。
- リアルタイム通信またはマルチプレイヤー セッションへの参加を許可されるユーザーに与えられている権限を判別する。
- 認証トークンをフェッチする。
注意
XUserHandle
値が異なっていても、同じユーザーを指し示す可能性があります。
ゲームで、2 つの 異なるXUserHandle
値が異なるユーザーを指し示しているかどうかを比較するには、XUserCompare
関数を使用できます。
XUser 識別子
特定の XUser
には 2 つの異なる識別子が関連付けらます。ローカル ID と Xbox サービス ID (XUID) です。
ローカル ID は、ゲーム セッションでのユーザーのライフタイムに渡って維持される識別子です。 ゲームによって生成されるすべてのプロセスで、またはゲームが XLaunchNewGame
を呼び出した場合にローカル ID を使用します。 ただし、
ローカル ID を使用して、ゲーム セッションをまたがってユーザーを識別しないでください。
ユーザーのローカル ID を取得するには、XUserGetLocalId
関数を使用します。
Xbox サービス ID (XUID) は、Xbox サービスと通信するとき、またはタイトルの呼び出し可能な UI (TCUI) を呼び出すときに使用する必要がある ID です。 ユーザーの XUID を取得するには、XUserGetId
関数を使用します。 XUID を取得するには、ユーザーの同意が必要な場合があります。 この同意が必要であり、許可されていない場合は、XUserGetId
は E_GAMEUSER_RESOLVE_USER_ISSUE_REQUIRED を返します。 問題を解決して同意を得るには、ゲームで XUserResolveIssueWithUiAsync
を呼び出す必要があります。
XUser の状態
ユーザーは、次の 3 つの状態のいずれかになります。Xbox サービスにサインインしているか、Xbox サービスからサインアウトしている途中か、Xbox サービスから完全にサインアウトしている状態です。 ゲームでは、XUserGetState
関数を使用して、特定のユーザーに関するこの状態をクエリできます。 ゲームでは、XUserRegisterForChangeEvent
関数を使用して変更通知に登録することもできます。
XUser
の状態に基づいて、ネットワーク接続を判断しないでください。
XUserState
が SignedIn
である場合、これは、ある時点においてユーザーが Xbox サービスで認証され、アクティブなユーザーとして扱えることを示しています。 ただし、ネットワークは接続されていない可能性があります。
ユーザーのゲームへの追加またはゲームからの削除
Xbox One ERA のモデルとは異なり、ゲームが対話できるのは、ゲームが XUserAddAsync
関数を呼び出すことで要求したユーザーだけです。 たとえば、ユーザー A とユーザー B の 2 人のユーザーが、本体にサインインしているものとします。
誰かがゲームを起動します。 このシナリオでは、それが誰であるかは問題ではありません。
ゲームは、
XUserRegisterForChangeEvent
を使用してユーザー状態の変更に登録します。ゲームは
XUserAddAsync
を呼び出し、ユーザー A がゲームにサインインします。ゲームは、ユーザー A を表す
XUserHandle
を持つようになります。ユーザー B が、ガイドからサインアウトを選択します。
ゲームに対し、サインイン変更イベントは発生しません。 ゲームがユーザー B について認識することはありません。
ユーザー A が、ガイドからサインアウトを選択します。
ゲームは、まずユーザー A がサインアウトの処理中であることを示す変更イベントを受け取った後、最終的にユーザー A がサインアウトしたことを示す別のイベントを受け取ります。
ゲームでは、ユーザーをゲームに追加できる一方で、以下に示す方法のうち 1 つを使用してユーザーを削除する方法は限られています。
- ゲームは、
XUserCloseHandle
関数を使用して、ユーザーを表すすべてのハンドルを閉じることができます。 - ユーザーが、ガイドを使用して本体からサインアウトします。
- ユーザーが、異なるデバイスにサインインします。
ユーザーの種類
Xbox One でサポートされるユーザーには、Xbox プレイヤーとゲストの 2 種類があります。
Xbox プレイヤーは、システム上のユーザーと同じく、完全な機能を備えています。 このユーザーは最初に、ユーザーをサインインさせるためのシステム提供 UI であるアカウントの選択画面で新しいアカウントを追加することによって作成されます。 Xbox プレイヤーは、設定アプリで明示的に削除されない限り、本体に存在し続けます。
Xbox ゲストは、本体上で 1 回のセッションを利用します。 Xbox ゲストは、ユーザーがゲストとしてプレイすることをアカウントの選択画面で選択したときに作成され、別のサインイン済み Xbox プレイヤーがスポンサーになります。 ゲストは、サインアウトするか、スポンサーの Xbox プレイヤーがサインアウトするか、本体の電源が切られるまで存在し続けます。
ゲストを許可するゲームでは、XUserAddAsync
を呼び出すときに AllowGuest
オプションを指定する必要があります。
ユーザーを追加するパターン
ゲームでは必ず初期ユーザーの確立を試行する必要があります。 これを実現するには、主に 2 つの方法があります。
オプション 1: UI を表示せずに、できるだけ早くユーザーを特定する
-
AddDefaultUserSilently
を使用してXUserAddAsync
を呼び出します。 この関数は、UI を表示せずにゲームを起動したユーザーの特定を試行します。 -
XUserAddAsync
の呼び出しは、E\_GAMEUSER\_NO\_DEFAULT\_USER
で失敗する可能性があります。 この場合は、ゲームを最初に起動したときに誰もサインインしていませんでした。 最初のユーザーを確立するには、ゲームがAddDefaultUserSilently
フラグを使用せずにXUserAddAsync
を呼び出す必要があります。 "サイレント" オプションとは異なり、この呼び出しにより、同意のあるすべての問題が完全に解決され、呼び出しが成功した場合、ユーザーは Xbox サービスにサインインされます。 ゲームは、そのユーザーに基づいて Xbox コンテキストを作成することができます。
オプション2: UI を表示する可能性とともにユーザーを特定する
AddDefaultUserAllowingUI
を使用して XUserAddAsync
を呼び出します。 前の (サイレント) オプションと同じように、この関数はゲームを起動したユーザーの特定を試行します。 前のオプションとは異なり、既定のユーザーが特定できない場合は、UI が表示され、プレイヤーがサインインしたり、自分で選択したりできるようになります。
XUserAddResult
が成功した場合、ゲームには Xbox サービスに完全にサインインしているユーザーがいて、ゲームはそのユーザーの Xbox コンテキストを作成できます。
これらの手順を示すサンプル コードについては、「方法: ユーザーをサインインするためのベストプラクティス」を参照してください。
XUserHandle の管理
各 XUserHandle
は、ユーザーを表します。 しかし、このような複数の各ハンドルが同じユーザーを表す場合があります。 この場合は、ゲームでは次の基本的なパターンを使用する必要があります。
ゲームで処理するユーザーのコレクションを表す
XUserHandle
インスタンスのコレクションを維持します。XUserRegisterForChangeEvent
を呼び出して、XUser
の状態変更に登録します。 ユーザーがサインアウトしたことがわかったら、コレクションのユーザーを更新します。新しい
XUserHandle
をXUserAddAsync
から取得したら、それが新しいユーザーを表すかどうかを確認します。XUserCompare
を使用して、ハンドルと直接比較することができます。XUserGetLocalId
を呼び出して見つかったローカル ID を使用して比較することもできます。複数の
XUserHandle
インスタンスが同じユーザーを表している場合は、XUserCloseHandle
を使用して余分なインスタンスを削除します。