

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

# 使用伺服器 SDK 將 Amazon GameLift Servers新增至您的遊戲伺服器
<a name="gamelift-sdk-server-api"></a>

本主題針對您需要新增至遊戲伺服器程式碼的伺服器 SDK 功能提供一般指引/ 此功能可讓遊戲伺服器程序與 Amazon GameLift Servers服務通訊。針對您計劃部署到Amazon GameLift Servers受管 EC2 機群、受管容器機群或 Anywhere 機群的遊戲伺服器，請使用這些指示。

遊戲伺服器程序會與服務通訊Amazon GameLift Servers，以接收來自服務的指示，並報告伺服器程序運作狀態和遊戲工作階段狀態。如需遊戲託管解決方案元件 （遊戲伺服器、後端服務、遊戲用戶端和 Amazon GameLift Servers) 之間互動的詳細資訊，請參閱 [遊戲用戶端/伺服器與 的互動 Amazon GameLift Servers](gamelift-sdk-interactions.md)。

**取得伺服器 SDK**

若要準備您的遊戲進行託管，請將適用於 的伺服器 SDK Amazon GameLift Servers 新增至您的遊戲伺服器專案。伺服器 SDK 提供多種語言。如需遊戲伺服器工具支援的詳細資訊，包括伺服器 SDK，請參閱 [取得Amazon GameLift Servers開發工具](gamelift-supported.md)。

從 [github.com/amazon-gamelift](https://github.com/amazon-gamelift)：// 下載適用於開發語言的伺服器 SDK。您可以找到伺服器 SDK 版本、外掛程式和其他開發工具的儲存庫。

**注意**  
如果您使用 Unreal Engine 或 Unity 進行開發，請下載這些遊戲引擎的Amazon GameLift Servers外掛程式。伺服器 SDK 已內建並可供使用。如需其他資訊，請參閱下列連結：  
Unreal Engine ([下載外掛程式](https://github.com/amazon-gamelift/amazon-gamelift-plugin-unreal)) ([整合指南](integration-engines-setup-unreal.md))
Unity ([下載外掛程式](https://github.com/amazon-gamelift/amazon-gamelift-plugin-unity)) ([整合指南](integration-engines-unity-using.md))

伺服器開發套件 API 參考：
+ [適用於 -- 動作的 C\+\+ 伺服器 SDK Amazon GameLift Servers 5.x](integration-server-sdk5-cpp-actions.md)
+ [適用於 -- 動作的 C\# 伺服器 SDK Amazon GameLift Servers 5.x](integration-server-sdk5-csharp-actions.md)
+ [適用於 -- 動作的 C\+\+ (Unreal) 伺服器 SDK Amazon GameLift Servers 5.x](integration-server-sdk5-unreal-actions.md)
+ [適用於 Amazon GameLift Servers -- 動作的 Go 伺服器 SDK](integration-server-sdk-go-actions.md)

## 初始化伺服器程序
<a name="gamelift-sdk-server-initialize"></a>

新增程式碼以建立Amazon GameLift Servers與服務的通訊，並在遊戲伺服器程序準備好託管遊戲工作階段時回報。此程式碼必須在任何Amazon GameLift Servers程式碼之前執行。

1. 呼叫 來初始化 Amazon GameLift Servers API 用戶端`InitSdk()`。如果您要準備在Amazon GameLift Servers受管 EC2 機群上執行遊戲伺服器，請使用預設 `InitSDK()`([C\+\+](integration-server-sdk5-cpp-actions.md#integration-server-sdk5-cpp-initsdk)) ([C\#](integration-server-sdk5-csharp-actions.md#integration-server-sdk5-csharp-initsdk)) ([Unreal](integration-server-sdk5-unreal-actions.md#integration-server-sdk5-unreal-initsdk)) ([Go](integration-server-sdk-go-actions.md#integration-server-sdk-go-initsdk))  且不含參數。API 用戶端會為您處理 Amazon GameLift Servers服務的連線。
**如果您要準備在 Amazon GameLift Servers Anywhere 機群上使用遊戲伺服器：**  
`InitSdk()` 使用下列 呼叫 來初始化 Amazon GameLift Servers API 用戶端`ServerParameters`：  
用來連線至遊戲伺服器的 Websocket URL。
用於託管遊戲伺服器的程序 ID。
託管遊戲伺服器程序的運算 ID。
包含 Amazon GameLift Servers Anywhere 運算的機群 ID。
Amazon GameLift Servers 操作 所產生的授權字符`[GetComputeAuthToken](https://docs.aws.amazon.com/gameliftservers/latest/apireference/API_GetComputeAuthToken.html)`。

1. 通知服務遊戲伺服器程序已準備好託管遊戲工作階段。使用下列 呼叫 `ProcessReady()`([C\+\+](integration-server-sdk5-cpp-actions.md#integration-server-sdk5-cpp-processready)) ([C\#](integration-server-sdk5-csharp-actions.md#integration-server-sdk5-csharp-processready)) ([非真實](integration-server-sdk5-unreal-actions.md#integration-server-sdk5-unreal-processready)) ([Go](integration-server-sdk-go-actions.md#integration-server-sdk-go-processready))  `ProcessParameters`。每個遊戲伺服器程序`ProcessReady()`只能呼叫一次。
   + 伺服器程序的連接埠號碼。當伺服器程序啟動遊戲工作階段時，它會提供 Amazon GameLift Servers服務的連接埠，以更新遊戲工作階段資訊。您的遊戲可以擷取此資訊並將其提供給遊戲用戶端，以使用它連線到伺服器程序並加入遊戲工作階段。
   + Amazon GameLift Servers 您要為您存放的檔案位置。這些可能包括遊戲工作階段日誌，以及伺服器程序在遊戲工作階段期間產生的其他檔案。雖然 會將這些檔案暫時Amazon GameLift Servers儲存在執行伺服器程序的運算上，但這些檔案只能在執行個體關閉之前使用。您可以透過[Amazon GameLift Servers主控台](https://console.aws.amazon.com/gamelift)或呼叫 Amazon GameLift Servers API 操作 [GetGameSessionLogUrl()](https://docs.aws.amazon.com/gameliftservers/latest/apireference/API_GetGameSessionLogUrl.html) 來存取儲存的檔案。
**如果您準備在Amazon GameLift Servers受管容器機群上使用遊戲伺服器：**  
您不需要指定容器機群的日誌參數。反之，請將遊戲工作階段和其他日誌資料傳送至標準輸出。容器機群會自動將所有容器標準輸出擷取為日誌串流。
   + 下列回呼函數Amazon GameLift Servers允許 傳送訊息或提示至遊戲伺服器程序。您必須在遊戲伺服器程式碼中實作這些函數。如需詳細資訊，請參閱 `ProcessParameters`([C\+\+](integration-server-sdk5-cpp-datatypes.md#integration-server-sdk5-cpp-dataypes-process)) ([C\#](integration-server-sdk5-csharp-datatypes.md#integration-server-sdk5-csharp-dataypes-process)) ([Unreal](integration-server-sdk5-unreal-datatypes.md#integration-server-sdk5-unreal-dataypes-process)) ([Go](integration-server-sdk-go-datatypes.md#integration-server-sdk-go-dataypes-process))  。
     + （選用） `onHealthCheck` – 定期Amazon GameLift Servers呼叫此函數，向伺服器請求運作狀態報告。
     + `onStartGameSession` – Amazon GameLift Servers呼叫此函數以回應用戶端請求 [CreateGameSession()](https://docs.aws.amazon.com/gameliftservers/latest/apireference/API_CreateGameSession.html)。
     + `onProcessTerminate` – Amazon GameLift Servers強制伺服器程序停止，使其正常關閉。
     + （選用） `onUpdateGameSession` – 將更新的遊戲工作階段物件Amazon GameLift Servers交付至遊戲伺服器，或提供配對回填請求的狀態更新。[FlexMatch 回填](https://docs.aws.amazon.com/gameliftservers/latest/flexmatchguide/match-backfill.html)功能需要此回呼。

   您也可以設定遊戲伺服器，使其可以安全地存取您擁有或控制的其他 AWS 資源。如需詳細資訊，請參閱[將Amazon GameLift Servers託管遊戲伺服器連接到其他 AWS 資源](gamelift-sdk-server-resources.md)。

## （選用） 報告伺服器程序運作狀態
<a name="gamelift-sdk-server-health"></a>

將程式碼新增至遊戲伺服器以實作回呼函數 `onHealthCheck()`。 會定期Amazon GameLift Servers叫用此回呼方法，以收集運作狀態指標。若要實作此回呼函數，請執行下列動作：
+ 評估伺服器程序的運作狀態。例如，如果任何外部相依性失敗，您可以將伺服器程序報告為運作狀態不佳。
+ 完成運作狀態評估和在 60 秒內回應回呼。如果 在此期間Amazon GameLift Servers未收到回應，則會自動將伺服器程序視為運作狀態不佳。
+ 傳回布林值：正常為 true，不良為 false。

如果您未實作運作狀態檢查回呼，則 會將伺服器程序Amazon GameLift Servers視為正常運作，除非伺服器未回應。

Amazon GameLift Servers 服務使用伺服器程序運作狀態來結束運作狀態不佳的程序，並清除資源。如果伺服器程序持續回報為運作狀態不佳，或連續三次未回應運作狀態檢查，則服務可能會關閉程序並啟動新的程序。服務會收集機群伺服器程序運作狀態的指標。

## （選用） 取得 TLS 憑證
<a name="gamelift-sdk-server-getcertificate"></a>

如果伺服器程序在已啟用 TLS 憑證產生功能的機群上執行，則您可以擷取 TLS 憑證來與遊戲用戶端建立安全連線，並加密用戶端伺服器通訊。憑證的副本會存放在執行個體上。若要取得檔案位置，請呼叫 `GetComputeCertificate()`([C\+\+](integration-server-sdk5-cpp-actions.md#integration-server-sdk5-cpp-getcomputecertificate)) ([C\#](integration-server-sdk5-csharp-actions.md#integration-server-sdk5-csharp-getcomputecertificate)) ([Unreal](integration-server-sdk5-unreal-actions.md#integration-server-sdk5-unreal-getcomputecertificate)) ([Go](integration-server-sdk-go-actions.md#integration-server-sdk-go-getcomputecertificate)) 。

## 啟動遊戲工作階段
<a name="gamelift-sdk-server-startsession"></a>

新增程式碼以實作回呼函數 `onStartGameSession`。 會Amazon GameLift Servers叫用此回呼，以在伺服器程序上啟動遊戲工作階段。

`onStartGameSession` 函數會將 [GameSession](https://docs.aws.amazon.com/gameliftservers/latest/apireference/API_GameSession.html) 物件作為輸入參數。此物件包含關鍵遊戲工作階段資訊，例如玩家數量上限。它也可以包含遊戲資料和玩家資料。函數實作應執行下列任務：
+ 根據`GameSession`屬性啟動動作以建立新的遊戲工作階段。遊戲伺服器至少必須關聯遊戲工作階段 ID，遊戲用戶端會在連線至伺服器程序時參考此 ID。
+ 視需要處理遊戲資料和玩家資料。此資料位於 `GameSession` 物件中。
+ 當新的遊戲工作階段準備好接受玩家時，請通知 Amazon GameLift Servers服務。呼叫伺服器 API 操作 `ActivateGameSession()`([C\+\+](integration-server-sdk5-cpp-actions.md#integration-server-sdk5-cpp-activategamesession)) ([C\#](integration-server-sdk5-csharp-actions.md#integration-server-sdk5-csharp-activategamesession)) ([Unreal](integration-server-sdk5-unreal-actions.md#integration-server-sdk5-unreal-activategamesession)) ([Go](integration-server-sdk-go-actions.md#integration-server-sdk-go-activategamesession)) 。為了回應成功的呼叫，服務會將遊戲工作階段狀態變更為 `ACTIVE`。

## （選用） 驗證新的玩家
<a name="gamelift-sdk-server-validateplayer"></a>

如果您要追蹤玩家工作階段的狀態，請新增程式碼，以在新玩家連線到遊戲伺服器時驗證新玩家。 會Amazon GameLift Servers追蹤目前玩家和可用的遊戲工作階段位置。

為了進行驗證，嘗試加入遊戲工作階段的遊戲用戶端必須包含玩家工作階段 ID。當您的遊戲透過呼叫 [StartGameSessionPlacement()](https://docs.aws.amazon.com/gameliftservers/latest/apireference/API_StartGameSessionPlacement.html) 或 [StartMatchmaking()](https://docs.aws.amazon.com/gameliftservers/latest/apireference/API_StartMatchmaking.html) 來啟動新的遊戲工作階段時， Amazon GameLift Servers會產生此 ID。在這些請求上，遊戲工作階段中的開放位置會保留給玩家工作階段。

當遊戲伺服器程序收到遊戲用戶端連線請求時，它會使用玩家工作階段 ID 呼叫 `AcceptPlayerSession()`([C\+\+](integration-server-sdk5-cpp-actions.md#integration-server-sdk5-cpp-acceptplayersession)) ([C\#](integration-server-sdk5-csharp-actions.md#integration-server-sdk5-csharp-acceptplayersession)) ([Unreal](integration-server-sdk5-unreal-actions.md#integration-server-sdk5-unreal-acceptplayersession)) ([Go](integration-server-sdk-go-actions.md#integration-server-sdk-go-acceptplayersession))  。為了回應， Amazon GameLift Servers 會驗證玩家工作階段 ID 是否對應至遊戲工作階段中預留的開放位置。在 Amazon GameLift Servers 驗證玩家工作階段 ID 之後，伺服器程序會接受連線。然後，玩家可以加入遊戲工作階段。如果 Amazon GameLift Servers未驗證玩家工作階段 ID，則伺服器程序會拒絕連線。

## （選用） 報告玩家工作階段結束
<a name="gamelift-sdk-server-droppedplayer"></a>

如果您要追蹤玩家工作階段的狀態，請新增程式碼，以在玩家離開遊戲工作階段Amazon GameLift Servers時通知 。此程式碼應在伺服器程序偵測到中斷連線時執行。 Amazon GameLift Servers 會使用此通知來追蹤遊戲工作階段中的目前玩家和可用位置。

若要處理程式碼中捨棄的連線，請使用對應的玩家工作階段 ID，將呼叫新增至伺服器 API 操作 `RemovePlayerSession()`([C\+\+](integration-server-sdk5-cpp-actions.md#integration-server-sdk5-cpp-removeplayersession)) ([C\#](integration-server-sdk5-csharp-actions.md#integration-server-sdk5-csharp-removeplayersession)) ([Unreal](integration-server-sdk5-unreal-actions.md#integration-server-sdk5-unreal-removeplayersession)) ([Go](integration-server-sdk-go-actions.md#integration-server-sdk-go-removeplayersession))  。

## 結束遊戲工作階段
<a name="gamelift-sdk-server-shutdownsession"></a>

將程式碼新增至伺服器程序關閉序列，以在Amazon GameLift Servers遊戲工作階段結束時通知 。若要回收和重新整理託管資源，請在遊戲工作階段完成後關閉每個伺服器程序。

在伺服器程序關閉代碼開始時，呼叫伺服器 API 操作 `ProcessEnding()`([C\+\+](integration-server-sdk5-cpp-actions.md#integration-server-sdk5-cpp-processending)) ([C\#](integration-server-sdk5-csharp-actions.md#integration-server-sdk5-csharp-processending)) ([Unreal](integration-server-sdk5-unreal-actions.md#integration-server-sdk5-unreal-processending)) ([Go](integration-server-sdk-go-actions.md#integration-server-sdk-go-processending))  g 。此呼叫Amazon GameLift Servers會通知伺服器程序正在關閉。 Amazon GameLift Servers會將遊戲工作階段狀態和伺服器程序狀態變更為 `TERMINATED`。呼叫 後`ProcessEnding()`，程序可以安全地關閉。

## 回應伺服器程序關閉通知
<a name="gamelift-sdk-server-terminate"></a>

新增程式碼以關閉伺服器程序，以回應來自 Amazon GameLift Servers服務的通知。當伺服器程序持續回報運作狀態不佳，或正在終止伺服器程序的執行個體時， 服務會傳送此通知。 Amazon GameLift Servers可以在容量縮減事件中停止執行個體，或回應 Spot 執行個體中斷。Spot 執行個體中斷提供兩分鐘的通知，讓伺服器程序有時間正常中斷與玩家的連線、保留遊戲狀態資料，以及執行其他清除任務。

若要處理關閉通知，請對遊戲伺服器程式碼進行下列變更：
+ 實作回呼函數 `onProcessTerminate()`([C\+\+](integration-server-sdk5-cpp-datatypes.md#integration-server-sdk5-cpp-dataypes-process)) ([C\#](integration-server-sdk5-csharp-datatypes.md#integration-server-sdk5-csharp-dataypes-process)) ([非真實](integration-server-sdk5-unreal-datatypes.md#integration-server-sdk5-unreal-dataypes-process)) ([Go](integration-server-sdk-go-datatypes.md#integration-server-sdk-go-dataypes-process)) 。此函數應呼叫關閉伺服器程序的程式碼。
+ 從遊戲伺服器關閉碼呼叫伺服器 API 操作 `GetTerminationTime()`([C\+\+](integration-server-sdk5-cpp-actions.md#integration-server-sdk5-cpp-getterm)) ([C\#](integration-server-sdk5-csharp-actions.md#integration-server-sdk5-csharp-getterm)) ([Unreal](integration-server-sdk5-unreal-actions.md#integration-server-sdk5-unreal-getterm)) ([Go](integration-server-sdk-go-actions.md#integration-server-sdk-go-getterm))  。如果 Amazon GameLift Servers 已發出停止伺服器程序的呼叫，則 會`GetTerminationTime()`傳回預估的終止時間。
+ 在遊戲伺服器關閉程式碼開始時，呼叫伺服器 API 操作 `ProcessEnding()`([C\+\+](integration-server-sdk5-cpp-actions.md#integration-server-sdk5-cpp-processending)) ([C\#](integration-server-sdk5-csharp-actions.md#integration-server-sdk5-csharp-processending)) ([Unreal](integration-server-sdk5-unreal-actions.md#integration-server-sdk5-unreal-processending)) ([Go](integration-server-sdk-go-actions.md#integration-server-sdk-go-processending)) 。此呼叫會通知 Amazon GameLift Servers 服務該伺服器程序正在關閉。然後，服務會將伺服器程序狀態變更為 `TERMINATED`。呼叫 後`ProcessEnding()`，程序可以安全地關閉。