用户和输入设备
游戏需要了解哪些输入设备与指定用户相关联。 这是回答以下问题的关键:
谁在游戏中执行了一个操作?
谁获得了成就?
谁正在进行购买?
本主题包含一些关键概念,这些概念可帮助你处理这些关联并回答这些类型的问题。
Xbox One ERA 和 Microsoft 游戏开发工具包 (GDK) 的用户模型差异
无论是开发新的 Microsoft 游戏开发工具包 (GDK) 游戏,还是从 Xbox One ERA 移植以前的游戏,当习惯 Xbox One ERA 中的用户模型时,实现用户和输入设备管理可能都会造成混乱。
需要用户的游戏(例如,当保存游戏或需要成就时)必须建立主要用户。 此主要用户是仅游戏的构造,而非由系统提供。
仅游戏通过调用 XUserAddAsync 得知所添加的用户。 游戏没有收到系统对尚未添加的用户执行的任何操作。
如果先前与游戏用户相关联的设备与游戏未识别的用户相关联,则仅在没有新用户的情况下,才会通知游戏设备关联事件。
如果未与游戏用户关联的设备与另一位同样没有使用 XUserAddAsync 添加的用户关联,则不会向游戏提供关联事件的通知。
帐户选取器的行为会根据引出其的方式而有所不同(系统指南与 XUserAddAsync)。
注意
UserManagement 示例涵盖了各种游戏情况下的用户管理和输入设备配对行为。 它还会处理 XR 要求,因为它们与用户和输入设备相关。 有关示例的详细信息,请参阅 Microsoft 游戏开发工具包示例。
如何识别指定用户
游戏使用本地 ID 与输入设备交互。 本地 ID 是在游戏会话内用户的整个生命周期中与用户绑定在一起的标识符。 该本地 ID 可以跨游戏衍生的任何进程使用,如果游戏调用 XLaunchNewGame,该本地 ID 也可以使用。 不要使用本地 ID 来标识跨游戏会话的用户。
要获取用户的本地 ID,请使用 XUserGetLocalId 函数。
如何识别特定的输入设备
游戏设备(如游戏板、街机摇杆和轮)都有一个用 APP\_LOCAL\_DEVICE\_ID 结构表示的唯一设备 ID。 该设备 ID 在游戏多次启动或系统重新启动后仍保留。 设备 ID 在同一系统上运行的两个不同游戏上是不同的。
如果你在主机上使用 XInput
,可以使用 XInputGetDeviceId 获取设备 ID。
如果你使用 GameInput,可以从 GameInputDeviceInfo 对象(从调用返回到 IGameInputDevice::GerDeviceInfo)的 deviceId
成员中获取设备 ID。
用户模型
当游戏需要有用户时,(例如,当需要保存游戏或成就时),游戏将完全负责建立主要用户。 即使允许多个用户登录,也必须保留此主用户。 游戏还必须允许必要时更改主要用户。 执行此操作的其中一种方法是设有切换用户 提示,使用 XUserAddAsync 引出帐户选取器。
帐户选取器列出以前在主机上登录的所有用户,提供新增按钮来登录新帐户,并允许临时访客用户登录。 可以选择这些用户帐户中的任何帐户,无论用户的真实身份是什么。 系统支持用户以此方式选择扮演其他人。
Microsoft 游戏开发工具包 (GDK) 游戏不完全了解系统上的用户。 相反,用户仅可通过调用至 XUserAddAsync添加到游戏中。 通过这种方式添加的用户是游戏可与之进行交互的唯一用户。 系统不会告知游戏其对尚未添加到游戏的用户所做的操作。 因此,游戏应保留自己的用户列表。
可通过两种不同的方法来设置帐户选取器:从“系统指南”和通过 XUserAddAsync。 在这两种情况下,选取器的行为是不同的:
案例 | XUserAddAsync 帐户选取器 | 指南帐户选择器 |
---|---|---|
选择尚未登录游戏的用户 | 用户将登录到系统和游戏。 | 用户仅登录到系统。 游戏没有收到登录通知。 |
选择已登录到游戏的用户 | 用户已登录到游戏,因此不会发生进一步的用户状态更改。 | 用户已登录到游戏,因此不会发生进一步的用户状态更改。 |
注意
登录到游戏的用户集始终是登录到系统的用户的子组。 游戏无法拥有未登录系统的登录用户。 但是,系统可以拥有游戏不知道的用户。
可通过 XUserRegisterForChangeEvent 寄存的 XUserChangeEventCallback 来处理用户事件。 将仅为已使用 XUserAddAsync 登录的用户调用事件。 当用户从系统注销时,游戏必须相应地作出反应,或者从游戏中删除用户,或者允许玩家再次尝试登录该用户。
输入设备关联
Microsoft 游戏开发工具包 (GDK) 允许用户拥有与之关联的任意数量的输入设备。 在迁移可能假设用户和设备之间 1:1 映射的旧游戏时,这可能会有挑战性。
设备关联通常通过帐户选取器来完成。 从 UI 中选择用户的输入设备将与该用户相关联。 关联也可以从其他情况中更改,例如当用户注销时,或者在没有 UI 的情况下,通过 AddDefaultUserSilently 和 AddDefaultUserAllowingUI 选项使用 XUserAddAsync。
根据选取器的引出方式,帐户选取器对关联的行为也会有所不同:
案例 | XUserAddAsync 帐户选取器 | 指南帐户选择器 |
---|---|---|
选择尚未登录游戏的用户 | 用户登录到游戏后,完成提示的设备将与用户相关联。 | 用户登录到系统(或者是,已登录),以及完成提示的设备会与该用户相关联。 由于游戏不知道该用户的相关信息,所以它将收到该设备未关联的通知。 |
选择已登录到游戏的用户 | 完成提示的设备将与系统和游戏用户相关联。 | 完成提示的设备将与系统和游戏用户相关联。 |
如果用户通过使用 AddDefaultUserSilently 或 AddDefaultUserAllowingUI 选项调用 XUserAddAsync 在未使用帐户选取器的情况下自动登录游戏,则系统的输入设备配对将传达给游戏。
若要收到用户设备关联更改的通知,可使用 XUserRegisterForDeviceAssociationChanged 方法注册 XUserDeviceAssociationChangedCallback 回调。 还可以调用 XUserFindForDevice 以查找特定设备的关联。
注意
由于游戏只能知道通过 XUserAddAsync 添加的用户,因此用户设备关联回调和方法仅可返回游戏先前添加的用户。
将用户与默认音频终结点匹配
玩游戏时会频繁使用耳机或麦克风。 下面是要弄清楚的一些重要问题。
用户是否有耳机? 如果有,他们使用的可能是哪种耳机? 默认通信呈现音频终结点是什么?
用户是否有与其关联的麦克风? 默认通信捕获终结点是什么?
要回答特定用户的这些问题,游戏可以调用 XUserGetDefaultAudioEndpointUtf16。 就向用户与设备的关联可以更改一样,也可以更改与特定用户关联的默认音频终结点。 为了检测这些关联更改,游戏应调用 XUserRegisterForDefaultAudioEndpointUtf16Changed,并关注得到的回调。