新增FlexMatch至遊戲用戶端 - Amazon GameLift

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

新增FlexMatch至遊戲用戶端

本主題說明如何將FlexMatch配對支援新增至您的用戶端遊戲服務。無論您是FlexMatch搭配 Amazon 託管主機還是搭配其他託GameLift管解決方案使用,程序基本上都是相同的。若要進一步了解 FlexMatch 與如何為遊戲設定自訂配對建置器,請參閱下列主題:

若要在您的遊戲中啟用FlexMatch配對功能,請新增下列功能:

  • 準備要求一個或多個玩家配對(必填)。

  • 追蹤配對要求的狀態 (必填)。

  • 要求玩家接受提議的比賽(可選)。

  • 在為新比賽建立遊戲工作階段後,取得玩家連線資訊並加入遊戲。

準備為玩家申請配對

我們強烈建議您的遊戲用戶端透過用戶端遊戲服務提出配對要求。藉由使用受信任的來源,您可以更輕鬆地防止駭客嘗試入侵和仿造玩家的資料。如果您的遊戲有工作階段目錄服務,這是處理配對請求的理想選擇。

為了準備您的用戶端服務,請執行下列工作:

  • 添加亞馬遜 GameLift API。您的用戶端服務會使用 Amazon GameLift API 中的功能,這是AWS開發套件的一部分。如需進一步了解開發AWS套件並下載最新版本,請參閱 Amazon GameLift SDK 以取得用戶端服務的開發套件。將此開發套件新增到您的遊戲用戶端服務專案。

  • 設置配對票系統。會對所有配對請求指派一個專屬的票證 ID。您需要可用來產生唯一 ID,並將其指派給新配對請求的機制。票證 ID 可使用任何字串格式,最長可達 128 個字元。

  • 取得遊戲建置器資訊。取得您計畫使用的配對組態名稱。您也需要配對建構器的必要玩家屬性清單,而這些屬性會定義於配對建構器的規則集中。

  • 取得玩家資料。設定取得每個玩家相關資料的方法。這包括玩家 ID、玩家屬性值,以及玩家可能進入遊戲的每個區域更新延遲資料。

  • (選用) 啟用配對回填。決定您想要回填現有配對遊戲的程度。如果您的配對建置器已經將回填模式設為「手動」(manual),您可能需要將回填支援新增到您的遊戲。如果回填模式設為「自動」(automatic),您可能需要針對個別遊戲工作階段關閉該模式的方法。進一步了解管理配對回填:使用回填現有遊戲 FlexMatch

要求玩家配對

將程式碼新增到您的用戶端服務,以便為 FlexMatch 服務建置器建立和管理配對請求。對於搭FlexMatch配 Amazon GameLiftmanaged 主機使用的遊戲以及作FlexMatch為獨立解決方案使FlexMatch用的遊戲,請求配對的程序是相同的。

建立配對請求:
  • 調用亞馬遜 GameLift API StartMatchmaking。每個請求都必須包含下列資訊。

    配對建構器

    要用於請求的配對配對組態名稱。FlexMatch將每個請求放入指定分房系統的集區中,然後根據配置分房系統的方式處理要求。這包括強制執行時間限制,無論是否請求玩家接受配對,放置產生的遊戲工作階段時要使用哪個佇列等。進一步了解規則建置器和規則集:設計 FlexMatch 分房系統

    票證 ID

    指派給請求的唯一票證 ID。與請求相關的所有內容 (包含事件和通知) 將會參考票證 ID。

    玩家資料

    您想要為其建立配對的玩家清單。根據配對規則與延遲最低限制,如果請求中有任何玩家不符合配對規定,配對請求就絕不會加以配對。配對請求中最多可加入 10 名玩家。如果請求中有多名玩家,FlexMatch 會嘗試建立單一配對,並將所有玩家指派給同一個隊伍 (隨機選取)。如果請求包含玩家人數過多而無法全部加入其中一個配對隊伍,則請求將無法配對。舉例來說,如果您已將配對建構器設定為建立二對二配對 (兩個隊伍,每隊兩名玩家),則您無法傳送包含超過兩名玩家的配對請求。

    注意

    玩家 (由玩家 ID 加以識別) 一次僅能加入一個進行中的配對請求。當您為玩家建立了新請求,任何含有相同玩家 ID 的啟用中配對票證均會自動取消。

    對於每個列出的玩家,請包含下列資料:

    • 玩家 ID — 每個玩家都必須有一個唯一的玩家 ID,您可以產生該 ID。請參閱產生玩家 ID

    • 玩家屬性 — 如果使用中的分房系統要求玩家屬性,請求必須為每位玩家提供這些屬性。配對規則集會定義必要的玩家屬性,其中也會指定屬性的資料類型。只有當規則集指定屬性的預設值時,玩家屬性才會是選用的。如果配對請求未提供所有玩家的必要玩家屬性,則配對請求永遠無法成功。在建立FlexMatch規則集FlexMatch 規則集範例中進一步了解配對建置規則集和玩家屬性。

    • 玩家延遲 — 如果使用中的分房系統有玩家延遲規則,請求必須回報每位玩家的延遲時間。玩家延遲資料是每個玩家的一或多個值的清單。其代表玩家在配對建構器佇列中區域的玩家體驗延遲。如果請求中沒有包含玩家的延遲值,則無法對玩家進行配對,請求也會失敗。

擷取配對請求詳細資訊:
  • 發送匹配請求後,您可以通過調DescribeMatchmaking用請求的工單 ID 來查看請求詳細信息。此呼叫會傳回請求資訊,包含目前的狀態。成功完成請求之後,票證也會包含遊戲用戶端連線至配對所需的資訊。

取消配對請求:
  • 您可以隨時透過撥打StopMatchmaking要求的票證 ID 來取消配對要求。

追蹤配對活動

設定通知以追蹤 Amazon 針對配對程序GameLift發出的事件。您可以直接設定通知、建立 SNS 主題或使用 Amazon EventBridge。如需有關設定通知的詳細資訊,請參閱 設定FlexMatch事件通知。設定好通知後,在用戶端服務上新增接聽程式,以偵測事件並依需求回應。

當一大段時間過去而完全不通知的情況下,定期輪詢狀態更新來備份通知,也是個不錯的主意。若要盡量降低對於配對效能的影響,請務必在配對單提交後至少 30 秒或最後收到通知後才進行輪詢。

使DescribeMatchmaking用要求的票證 ID 撥打電話,擷取配對請求票證 (包括目前狀態)。建議輪詢不要超過 10 秒一次。這個方法僅適用於低用量開發案例。

注意

在進行大量配對使用之前 (例如進行生產前負載測試),您應該使用事件通知來設定遊戲。公開發行版本中的所有遊戲都應該使用通知,不論用量如何。持續輪詢方式只適用於開發時使用少量配對的遊戲。

請求玩家接受

如果您正在使用玩家已開啟接受的遊戲建置器,則將程式碼新增到您的用戶端服務,以管理玩家接受程序。對於FlexMatch搭配 Amazon GameLift 代管主機使用的遊戲以及FlexMatch作為獨立解決方案使用的遊戲,管理玩家接受程序是相同的。

請求玩家接受建議配對:
  1. 當提議配對需要玩家接受時進行偵測。當狀態變更為 REQUIRES_ACCEPTANCE 時,監控配對票證以進行偵測。對此狀態的變更會觸發FlexMatch事件MatchmakingRequiresAcceptance

  2. 獲得所有玩家接受。建立機制,以便向每個玩家出示配對票證中的提議配對詳細資訊。玩家必須能夠表示他們接受或拒絕提議的配對。您可以通過調用來檢索匹配詳細信息DescribeMatchmaking。玩家須在有限時間內回應,否則配對建置器會撤銷提議的配對並繼續下一步。

  3. 向 FlexMatch 回報玩家回應。通過撥打AcceptMatch接受或拒絕來報告玩家回應。配對請求中的所有玩家均需接受配對才能繼續。

  4. 處理接受失敗的票證。當任何玩家在提議的配對中拒絕配對,或無法於接受時間限制內回覆,請求都會失敗。確實接受比賽的玩家的門票將自動返回到彩票池中。不接受比賽的玩家的門票將移至「失敗」狀態且不再處理。對於有多名玩家的彩票,如果彩票中有任何玩家不接受比賽,則整張彩票將失敗。

連接到匹配

將程式碼新增至您的用戶端服務,以處理成功格式的相符項目 (狀態COMPLETED或事件MatchmakingSucceeded)。這包括通知配對的玩家並將連線資訊交付到其遊戲用戶端。

對於使用 Amazon 託GameLift管的遊戲,當配對請求成功完成時,遊戲工作階段連線資訊會新增至配對票證中。透過呼叫DescribeMatchmaking擷取已完成的配對票券。連線資訊包含遊戲工作階段的 IP 地址和連接埠,以及每個玩家 ID 的玩家工作階段 ID。請至 GameSessionConnectionInfo 進一步了解。您的遊戲客戶端可以使用此信息直接連接到比賽的遊戲會話。連線要求應包含玩家工作階段 ID 和玩家 ID。此資料會將連線的玩家與遊戲工作階段的比賽資料相關聯,其中包括團隊指派 (請參閱 GameSession)。

對於使用其他託管解決方案的遊戲 (包括 Amazon GameLift FleetIQ),您必須建置機制,讓配對玩家能夠連線到適當的遊戲工作階段。

配對要求範例

下列程式碼片段會針對數個不同的配對系統建立配對要求。如上所述,請求必須提供使用中配對建置器所需的玩家屬性,如同配對建置器規則集所定義。提供的屬性必須使用相同的資料類型,如規則集中定義的數字 (N) 或字串 (S)。

# Uses matchmaker for two-team game mode based on player skill level def start_matchmaking_for_cowboys_vs_aliens(config_name, ticket_id, player_id, skill, team): response = gamelift.start_matchmaking( ConfigurationName=config_name, Players=[{ "PlayerAttributes": { "skill": {"N": skill} }, "PlayerId": player_id, "Team": team }], TicketId=ticket_id) # Uses matchmaker for monster hunter game mode based on player skill level def start_matchmaking_for_players_vs_monster(config_name, ticket_id, player_id, skill, is_monster): response = gamelift.start_matchmaking( ConfigurationName=config_name, Players=[{ "PlayerAttributes": { "skill": {"N": skill}, "desiredSkillOfMonster": {"N": skill}, "wantsToBeMonster": {"N": int(is_monster)} }, "PlayerId": player_id }], TicketId=ticket_id) # Uses matchmaker for brawler game mode with latency def start_matchmaking_for_three_team_brawler(config_name, ticket_id, player_id, skill, role): response = gamelift.start_matchmaking( ConfigurationName=config_name, Players=[{ "PlayerAttributes": { "skill": {"N": skill}, "character": {"S": [role]}, }, "PlayerId": player_id, "LatencyInMs": { "us-west-2": 20} }], TicketId=ticket_id) # Uses matchmaker for multiple game modes and maps based on player experience def start_matchmaking_for_multi_map(config_name, ticket_id, player_id, skill, maps, modes): response = gamelift.start_matchmaking( ConfigurationName=config_name, Players=[{ "PlayerAttributes": { "experience": {"N": skill}, "gameMode": {"SL": modes}, "mapPreference": {"SL": maps} }, "PlayerId": player_id }], TicketId=ticket_id)