XUserAddAsync
ユーザーをゲーム セッションに非同期で追加します。
構文
HRESULT XUserAddAsync(
XUserAddOptions options,
XAsyncBlock* async
)
パラメーター
options _In_
型: XUserAddOptions
ユーザーをゲーム セッションに追加するオプション。
async _Inout_
型: XAsyncBlock*
XAsyncBlock は、呼び出しのステータスをポーリングし、呼び出しの結果を取得します。
戻り値
型: HRESULT
HRESULT 成功またはエラー コード。 エラー コードの一覧については、「エラー コード」を参照してください。
解説
XUserAddAsync は、ユーザーをゲームに追加する非同期操作を開始します。 XUserAddResult を使用して、操作の結果を取得します。
XUserAddAsync は、options パラメーターに XUserAddOptions::AddDefaultUserSilently または XUserAddOptions::AddDefaultUserAllowingUI を渡さない限り、常にアカウント ピッカー UI を表示します。
XUserAddOptions::AddDefaultUserSilently を使用すると、XUserAddAsync は UI を表示しません。
簡略化されたユーザー モデル (NDA トピック)認可が必須ですを使用する場合、この関数にはいくつかの考慮事項があります。
- 簡略化されたユーザー モデルでは、開発者は オプション が XUserAddOptions::AddDefaultUserSilently に設定されていることを確認する必要があります。
- 本体では、シンプルなユーザー モデルを使用するルース デプロイメント ゲームは、すでに既定のユーザーがサインインしていない限り、起動が許可されません。
- PC では、簡略化されたユーザー モデルを使用する緩く展開されたゲームは、ユーザーなしで起動できます。ただし、ゲームが XUserAddAsync を呼び出した場合、誰もサインインしていなければゲームは終了し、PC Bootstrapper が起動されてユーザーのサインインをサポートするようになっています。 それ以降の起動は、ユーザーが Xbox Live に完全にサインインしている限り、問題なく行うことができます。
オプションを XUserAddOptions::AddDefaultUserSilently に設定して XUserAddAsync を繰り返し呼び出す場合、開発者が知っておくべきいくつかのエッジ ケースがあります。
- これを繰り返し呼び出し、ゲームを開始した既定のユーザーがわかっている場合は、その同じユーザーを返します。
- 以前にわかっていた既定のユーザーがサインアウトして、デバイスにサインインしているユーザーが 1 人だけである場合、そのユーザーを新しい「既定の」ユーザーとしてマークし、そのユーザーを返します。
- 以前に認識されていた既定のユーザーがサインアウトして、複数のユーザーがデバイスにサインインした場合、E_GAMEUSER_NO_DEFAULT_USER を返します。
既定のユーザーがいない場合、XUserAddResult は E_GAMEUSER_NO_DEFAULT_USER を返します。 オプションを XUserAddOptions::AddDefaultUserSilently に設定せずに XUserAddAsync を呼び出す必要があります。
オプションを XUserAddOptions::AddDefaultUserAllowingUI に設定して XUserAddAsync を繰り返し呼び出す場合、開発者が知っておくべきいくつかのエッジ ケースがあります。 これらは、暗黙的な UI の場合とよく似ています (ただし同じではありません)。
- これを繰り返し呼び出し、ゲームを開始した既定のユーザーがわかっている場合は、その同じユーザーを返します。
- 以前にわかっていた既定のユーザーがサインアウトして、デバイスにサインインしているユーザーが 1 人だけである場合、そのユーザーを新しい「既定の」ユーザーとしてマークし、そのユーザーを返します。
- ユーザーが最初にゲームを開始したユーザーをサインアウトして、ユーザー数が 0 または 2 以上の場合、システムはユーザーを取得するための UI を表示し、そのユーザーを既定として設定します。
XUserAddOptions::AllowGuests は XUserAddOptions::AddDefaultUserSilently と一緒に使用できません。 ゲストを既定ユーザーにすることはできません。 XUserAddOptions::AllowGuests は、現在のプラットフォームでゲストがサポートされるかどうかにかかわらず確実に使用できます。
XUserCloseHandle を呼び出して XUser API から取得した各 XUserHandle ハンドルを 1 回だけ閉じる必要があります。
入力デバイスのペアリングは、XUserAddAsync が正常に完了すると実行されます。 XUserAddOptions::AddDefaultUserSilently または XUserAddOptions::AddDefaultUserAllowingUI オプションによって、UI を使用せずにサインインが自動的に実行された場合、システムでユーザーに割り当てられている入力デバイスがタイトルに伝達されます。 サインインに UI が表示された場合は、ユーザーを選択した入力デバイスがそのユーザーに割り当てられます。
デバイスの関連付けは、XUserRegisterForDeviceAssociationChanged メソッドを使用して追跡できます。
次の例は、非同期的にユーザーをゲーム セッションに追加する方法を示しています。
HRESULT AddUserComplete(XAsyncBlock* ab)
{
unique_user_handle user;
RETURN_IF_FAILED(XUserAddResult(ab, &user));
XUserLocalId userLocalId;
XUserGetLocalId(user.get(), &userLocalId);
auto iter = std::find_if(
_users.begin(),
_users.end(),
[&userLocalId](const User& candidate)
{
XUserLocalId candidateUserLocalId;
XUserGetLocalId(candidate.Handle(), &candidateUserLocalId);
return candidateUserLocalId == userLocalId;
});
// User already known
if (iter != _users.end())
{
appLog.AddLog("User already in list\n");
return S_OK;
}
try
{
_users.emplace_back(user.get());
_users.back().LoadGamerPicAsync(_queue);
}
CATCH_RETURN();
return S_OK;
}
HRESULT AddUser(bool allowGuests, bool silent)
{
auto asyncBlock = std::make_unique<XAsyncBlock>();
ZeroMemory(asyncBlock.get(), sizeof(*asyncBlock));
asyncBlock->queue = _queue;
asyncBlock->context = this;
asyncBlock->callback = [](XAsyncBlock* ab)
{
auto asyncBlock = std::unique_ptr<XAsyncBlock>(ab);
LOG_IF_FAILED(static_cast<UserWindow*>(ab->context)->AddUserComplete(ab));
};
XUserAddOptions options = XUserAddOptions::None;
if (allowGuests)
{
WI_SET_FLAG(options, XUserAddOptions::AllowGuests);
}
if (silent)
{
WI_SET_FLAG(options, XUserAddOptions::AddDefaultUserSilently);
}
if (SUCCEEDED_LOG(XUserAddAsync(
options,
asyncBlock.get())))
{
// The call succeeded, so release the std::unique_ptr ownership of XAsyncBlock* since the callback will take over ownership.
// If the call fails, the std::unique_ptr will keep ownership and delete the XAsyncBlock*
asyncBlock.release();
}
return S_OK;
}
要件
ヘッダー: XUser.h
ライブラリ: xgameruntime.lib
サポートされているプラットフォーム: Windows、Xbox One ファミリー本体、Xbox Series 本体