> ## Documentation Index
> Fetch the complete documentation index at: https://devdocs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 使用者與輸入裝置

> 使用者與輸入裝置

遊戲需要知道哪些輸入裝置與指定的使用者相關聯。
這是回答下列問題的關鍵：

* 誰在遊戲中執行了動作？

* 誰獲得成就？

* 誰在進行購買？

本主題涵蓋一些關鍵概念，可協助您處理這些關聯並回答
這類問題。

## XBOX One ERA 與 Microsoft Game Development Kit (GDK) 之間使用者模型的差異

無論是開發新的 Microsoft Game Development Kit (GDK) 遊戲，還是從 XBOX One ERA 移植先前的遊戲，如果您已習慣 XBOX One ERA 的使用者模型，實作使用者和輸入裝置管理可能會令人困惑。

* 需要使用者的遊戲 (例如需要遊戲存檔或成就時) 必須建立主要
  使用者。此主要使用者是僅限遊戲的概念，並非由系統提供。

* 遊戲只知道透過呼叫 [XUserAddAsync](/zh-TW/reference/system/xuser/functions/xuseraddasync) 新增的使用者。對於遊戲
  未新增的使用者，系統所採取的任何動作都不會通知遊戲。

* 當先前與遊戲使用者相關聯的裝置與遊戲不知道的使用者建立關聯時，
  遊戲只會收到裝置關聯事件的通知，而不會得知新的使用者。

* 如果未與遊戲使用者相關聯的裝置，與另一位同樣未
  透過 [XUserAddAsync](/zh-TW/reference/system/xuser/functions/xuseraddasync) 新增的使用者建立關聯，則遊戲不會收到該關聯事件的通知。

* 帳戶選擇器的行為會根據其開啟方式 (系統指南或
  [XUserAddAsync](/zh-TW/reference/system/xuser/functions/xuseraddasync)) 而有所不同。

<Note>UserManagement 範例涵蓋各種遊戲情境中的使用者管理和輸入裝置配對
行為。它也會處理與使用者和輸入裝置相關的 XR 需求。
如需範例的詳細資訊，請參閱
[Microsoft Game Development Kit 範例](/zh-TW/home/setup-install/samples)。</Note>

## 如何識別指定的使用者

遊戲使用「本機識別碼」與輸入裝置互動。本機識別碼是
在遊戲工作階段內，於使用者的整個存留期間都會跟隨該使用者的識別碼。本機識別碼可在
遊戲衍生的任何處理序之間使用，或在遊戲
呼叫 [XLaunchNewGame](/zh-TW/reference/system/xgame/functions/xlaunchnewgame) 時使用。請勿使用本機識別碼來
跨遊戲工作階段識別使用者。

若要取得使用者的本機識別碼，請使用 [XUserGetLocalId](/zh-TW/reference/system/xuser/functions/xusergetlocalid) 函式。

## 如何識別特定的輸入裝置

遊戲裝置 (例如遊戲台、大型機台搖桿和方向盤) 都有
唯一的「裝置識別碼」，以 [APP\_LOCAL\_DEVICE\_ID](/zh-TW/reference/system/xuser/structs/app_local_device_id) 結構表示。
此裝置識別碼在遊戲多次啟動或
系統重新啟動之間都會保留。在同一系統上執行的兩個
不同遊戲，其裝置識別碼也不同。

如果您在主機上使用 `XInput`，可以使用
[XInputGetDeviceId](/zh-TW/reference/input/xinputongameinput/functions/xinputgetdeviceid) 取得裝置識別碼。

如果您使用 [GameInput](/zh-TW/build/core-features/common/input/overviews/input-overview)，可以從
呼叫 [IGameInputDevice::GetDeviceInfo](/zh-TW/reference/input/gameinput/interfaces/igameinputdevice/methods/igameinputdevice_getdeviceinfo) 所傳回之
[GameInputDeviceInfo](/zh-TW/reference/input/gameinput/structs/gameinputdeviceinfo) 物件的 `deviceId` 成員取得裝置識別碼。

## 使用者模型

當遊戲需要使用者時 (例如需要遊戲存檔或成就時)，遊戲
須全權負責建立主要使用者。即使在
允許多位使用者登入時，也必須維持此主要使用者。遊戲也必須允許視需要變更主要使用者。
其中一種做法是提供「切換使用者」提示，以
[XUserAddAsync](/zh-TW/reference/system/xuser/functions/xuseraddasync) 開啟帳戶選擇器。

帳戶選擇器會列出先前曾在主機上登入的所有使用者，
提供用於登入新帳戶的 **\[新增]** 按鈕，並允許登入臨時
來賓使用者。無論使用者的真實身分為何，
都可以選取其中任何一個使用者帳戶。系統支援使用者以這種方式
選擇以他人身分遊玩。

Microsoft Game Development Kit (GDK) 遊戲並不完全了解系統上的使用者。相反地，使用者只能
透過呼叫 [XUserAddAsync](/zh-TW/reference/system/xuser/functions/xuseraddasync) 新增到遊戲中。以這種方式新增的使用者是
遊戲唯一可以互動的使用者。對於遊戲未新增的使用者，系統不會將其所採取的動作通知遊戲。
因此，遊戲應維護自己的使用者清單。

帳戶選擇器可以透過兩種不同方式開啟：從系統指南，以及透過
[XUserAddAsync](/zh-TW/reference/system/xuser/functions/xuseraddasync)。在這兩種情況下，此選擇器的行為有所不同：

| 案例 | [XUserAddAsync](/zh-TW/reference/system/xuser/functions/xuseraddasync) 帳戶選擇器 | 指南帳戶選擇器 |
| - | - | - |
| 選取尚未登入遊戲的使用者 | 使用者會同時登入系統和遊戲。 | 使用者只會登入系統。遊戲不會收到登入通知。 |
| 選取已登入遊戲的使用者 | 使用者已登入遊戲，因此不會發生進一步的使用者狀態變更。 | 使用者已登入遊戲，因此不會發生進一步的使用者狀態變更。 |

<Note>已登入遊戲的使用者集合，一律是已登入系統之使用者的
子集。遊戲不可能有系統未登入的已登入使用者。
不過，系統可能有遊戲不知道的使用者。</Note>

使用者事件可以透過以
[XUserRegisterForChangeEvent](/zh-TW/reference/system/xuser/functions/xuserregisterforchangeevent) 註冊的 [XUserChangeEventCallback](/zh-TW/reference/system/xuser/functions/xuserchangeeventcallback) 來處理。只有
透過 [XUserAddAsync](/zh-TW/reference/system/xuser/functions/xuseraddasync) 登入的使用者才會呼叫事件。當使用者從
系統登出時，遊戲必須做出相應的反應，從遊戲中移除該使用者，或允許玩家
再次嘗試登入該使用者。

## 輸入裝置關聯

Microsoft Game Development Kit (GDK) 允許使用者擁有任意數量的相關聯輸入裝置。在移植
可能假設使用者與裝置之間為 1:1 對應的較舊遊戲時，這可能會是一項挑戰。

裝置關聯通常是透過帳戶選擇器建立的。從 UI 選取使用者的
輸入裝置會與該使用者建立關聯。關聯也可能因其他情況而變更，例如
使用者登出時，或透過
[AddDefaultUserSilently](/zh-TW/reference/system/xuser/enums/xuseraddoptions) 和 [AddDefaultUserAllowingUI](/zh-TW/reference/system/xuser/enums/xuseraddoptions) 選項在沒有 UI 的情況下使用 [XUserAddAsync](/zh-TW/reference/system/xuser/functions/xuseraddasync) 時。

帳戶選擇器在關聯方面的行為，也會根據選擇器的開啟方式而有所不同：

| 案例 | [XUserAddAsync](/zh-TW/reference/system/xuser/functions/xuseraddasync) 帳戶選擇器 | 指南帳戶選擇器 |
| - | - | - |
| 選取尚未登入遊戲的使用者 | 使用者登入遊戲後，完成提示的裝置會與該使用者建立關聯。 | 使用者會登入系統 (如果尚未登入)，且完成提示的裝置會與該使用者建立關聯。由於遊戲不知道此使用者，因此會收到裝置已取消關聯的通知。 |
| 選取已登入遊戲的使用者 | 完成提示的裝置會與系統及遊戲使用者建立關聯。 | 完成提示的裝置會與系統及遊戲使用者建立關聯。 |

如果使用者是透過使用 [AddDefaultUserSilently](/zh-TW/reference/system/xuser/enums/xuseraddoptions) 或
[AddDefaultUserAllowingUI](/zh-TW/reference/system/xuser/enums/xuseraddoptions) 選項之一呼叫
[XUserAddAsync](/zh-TW/reference/system/xuser/functions/xuseraddasync)，而在沒有帳戶選擇器的情況下自動登入遊戲，則系統所擁有的輸入裝置配對
會傳達給遊戲。

若要收到使用者裝置關聯變更的通知，您可以使用
[XUserRegisterForDeviceAssociationChanged](/zh-TW/reference/system/xuser/functions/xuserregisterfordeviceassociationchanged) 方法註冊
[XUserDeviceAssociationChangedCallback](/zh-TW/reference/system/xuser/functions/xuserdeviceassociationchangedcallback) 回呼。您
也可以呼叫 [XUserFindForDevice](/zh-TW/reference/system/xuser/functions/xuserfindfordevice) 來查詢特定裝置的關聯。

<Note>由於遊戲只能知道透過
[XUserAddAsync](/zh-TW/reference/system/xuser/functions/xuseraddasync) 新增的使用者，因此使用者裝置關聯回呼和方法只能傳回
遊戲先前新增的使用者。</Note>

## 將使用者與預設音訊端點配對

遊戲經常搭配耳機或麥克風。以下是一些需要
詢問的重要問題。

* 使用者是否有耳機？如果有，他們可能使用哪一副耳機？
  預設的通訊轉譯音訊端點是什麼？

* 使用者是否有相關聯的麥克風？預設的
  通訊擷取端點是什麼？

若要針對特定使用者回答這些問題，遊戲可以呼叫
[XUserGetDefaultAudioEndpointUtf16](/zh-TW/reference/system/xuser/functions/xusergetdefaultaudioendpointutf16)。就像使用者與裝置的
關聯可能會變更一樣，與特定使用者相關聯的預設音訊端點
也可能會變更。若要偵測這些關聯變更，遊戲
應呼叫 [XUserRegisterForDefaultAudioEndpointUtf16Changed](/zh-TW/reference/system/xuser/functions/xuserregisterfordefaultaudioendpointutf16changed) 並留意
產生的回呼。


## Related topics

- [XR-112 在初始啟用和繼續時建立使用者與控制器](/zh-TW/publishing/certification/xr/xr-112.md)
- [XBOX 主機遊戲的認證測試 XBOX 需求](/zh-TW/publishing/certification/console-cert-tested-requirements.md)
- [XR-018：使用者產生的內容](/zh-TW/publishing/certification/xr/xr-018.md)
- [XBOX 遊戲的 XBOX 需求](/zh-TW/publishing/certification/xbox-requirements.md)
- [無障礙功能標籤](/zh-TW/build/game-principles/accessibility/accessibility-feature-tags.md)
