遊戲工作階段可見度
多人遊戲工作階段目錄 (MPSD) 的工作階段存取由兩項設定把關:工作階段可見度與工作階段可加入性。 這些設定可用來在 MPSD 層級限制工作階段存取。 存取控制的第一個層面是工作階段可見度。 工作階段可見度是在建立工作階段時設定的常數。 工作階段可見度通常在工作階段範本中定義,並決定哪些類型的使用者具有工作階段的讀取與寫入權限。 可見度設定的值如下。- Open: 所有使用者都可以讀取與寫入工作階段。
- Visible: 所有使用者都可以讀取,但只有已加入與已保留的玩家可以寫入工作階段。
- Private: 只有已加入與已保留的玩家可以讀取或寫入工作階段。
將可見度設為「private」時,受邀玩家可能需要重試
join() 呼叫。如果邀請是透過平台 UI 傳送的,另一位玩家可能會在該玩家於工作階段中被保留之前就收到邀請。這種競爭條件可能會導致受邀玩家的 join() 呼叫失敗,因為「private」或「visible」工作階段需要為加入的玩家進行保留。如果不存在任何保留,就會引發工作階段的存取錯誤 (HTTP/403)。受邀玩家接著必須重試 join() 作業。不過,重試頻率不應高於每五秒一次。建議遊戲將工作階段可見度設為「open」,以避免玩家加入流程中的競爭條件。遊戲工作階段可加入性
存取控制的第二個層面是可加入性。 它可以在工作階段存留期間動態設定,並決定哪些類型的使用者可以加入工作階段。 工作階段可加入性的值如下。- None: (預設值) 對於誰可以加入工作階段沒有任何限制。
- Local: 只有本機使用者可以加入工作階段。
- Followed: 只有本機使用者以及被其他工作階段成員追蹤的使用者,才能在沒有保留的情況下加入工作階段。
遊戲工作階段可加入性不會反映在 Party App UI 中。即使可加入性受到限制,Party App 邀請 UI 與
ShowSendInvitesAsync 仍允許遊戲工作階段邀請。遊戲派對可加入性
除了控制 MPSD 工作階段之外,遊戲也可以控制遊戲派對的可加入性狀態。 此設定可用來在派對層級限制遊戲派對的存取。 建立遊戲派對時,可以動態變更派對可加入性。 遊戲派對的可加入性狀態會反映在派對邀請 UI 中。 可加入性狀態可以設為下列值:- Invite-only: 此設定需要邀請才能加入遊戲派對。
- Joinable by Friends: (預設值) 此設定需要好友關係,玩家才能加入遊戲派對 (若要加入派對,派對成員必須追蹤加入的玩家)。
派對可加入性不會影響工作階段可加入性。不過,派對可加入性會反映在 Party App UI 中。玩家可以在遊戲外的 Party App 中手動變更派對可加入性。
建議
下列建議適用於最常見的遊戲情境。 遊戲應盡可能遵循這些設定,並應使用遊戲內邏輯,對新玩家是否可進入工作階段做出最終的權威判斷。建議的遊戲工作階段可見度:open
開放的遊戲工作階段不需要玩家保留。這可簡化邀請的流程。 傳送邀請後,工作階段仲裁者或主機不會在工作階段文件中保留玩家。 相反地,工作階段仲裁者或主機只會在本機追蹤受邀的玩家。 這讓玩家可以立即連線至主機,並判斷自己是否應加入工作階段、被拒絕,或應該等待 (如果支援等待中的玩家)。 仲裁者或主機擁有最終決定權,會回應並指示新成員留在工作階段中或離開工作階段。這需要受邀玩家在做出最終決定之前啟動遊戲並連線至仲裁者或主機。如果工作階段已滿或邀請遭拒,向使用者顯示錯誤訊息是可接受的。
若要與仲裁者或主機建立連線,需要安全裝置位址。應使用工作階段中的
HostDeviceToken 指出哪個工作階段成員是工作階段目前的仲裁者或主機,以及受邀玩家應連線至哪個安全裝置位址。建議的遊戲工作階段可加入性:預設 (未設定)
目前遊戲工作階段可加入性不會影響 Party App UI,也不會向使用者顯示。 為了簡化遊戲流程,遊戲可加入性應保持預設值,所有加入的決定權都應透過仲裁者或主機處理。建議的遊戲派對可加入性
遊戲派對可加入性取決於遊戲想要為使用者提供的工作階段類型。 兩種情境如下。- 開放遊戲: 對於開放遊戲,遊戲派對可加入性應保持預設值:「Joinable by Friends」。這讓好友可以在沒有邀請的情況下加入遊戲派對 (並進而加入遊戲工作階段)。
- 私人遊戲: 對於私人或封閉的遊戲,遊戲派對可加入性應設為「invite only」。這會限制其他玩家在沒有邀請的情況下加入派對 (並進而加入遊戲工作階段)。
玩家可以透過 Party App 手動變更遊戲工作階段的可加入性。
工作階段大小上限
工作階段的成員大小上限可用來限制加入遊戲工作階段的玩家人數。 不過,此限制可能會導致開放的位置在某些中斷連線情境下仍顯示為已滿。 例如,如果玩家因網路或電源故障而中斷連線,此延遲不會立即反映在工作階段中。 一旦目前狀態服務偵測到中斷連線 (最多 20 秒),成員就會被設為非作用中。接著,在非作用中逾時到期後,玩家就會被移除。 相較之下,使用活動訊號偵測中斷連線的對等網格,通常能在兩到三秒內察覺中斷連線,並可立即開放該玩家位置。 不過,仲裁者或主機無法移除其他成員。 為了解決此問題,工作階段的成員大小上限應一律設定為高於遊戲實際支援的最大玩家人數。 例如,如果玩家人數為 8,遊戲應將工作階段大小上限設為 12。 如此一來,即使先前的玩家尚未逾時,新玩家仍然可以加入。 仲裁者或主機會判斷工作階段是否已滿,然後設定一個自訂工作階段屬性,以決定新玩家是否仍可加入 (IsFull : “true”)。
這讓加入的玩家可以快速檢查工作階段是否可加入。
仲裁者或主機也應維護一個自訂屬性,依索引指出哪些成員已逾時 (例如 TimedOutPlayers : “3, 5, 9”)。
這讓新玩家可以正確識別目前的工作階段成員。
通知等待中的玩家
遊戲可以在遊戲派對之外管理一份排隊玩家清單,以支援等待中的玩家。 當玩家連線至主機而遊戲工作階段已滿時,該玩家會被新增至主機上的內部等候清單。 排隊的玩家不會加入遊戲工作階段,但會留在遊戲派對中。 為了將網路流量降至最低,等待中的玩家此時會中斷與主機的連線。- 當遊戲工作階段中有位置為等待中的玩家開放時,仲裁者或主機會呼叫 XblMultiplayerSessionAddMemberReservation 為該玩家新增保留。
-
此時,等待中的玩家還不知道這項保留。因此,仲裁者或主機必須呼叫
PullReservedPlayersAsync方法。 這會根據通知設定與遊戲焦點狀態,為所有已保留的玩家觸發 UI 通知或GameSessionReady通知。 - 收到此通知時,新玩家會重新連線至主機,並加入工作階段。
如果遊戲被暫停或終止,玩家會自動從遊戲派對中移除。玩家不會再收到任何通知。
用戶端多人遊戲流程


