

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# プレイヤーゲートウェイをゲームに統合する
<a name="ddos-protection-integrate"></a>

プレイヤーゲートウェイ対応フリートを作成したら、ゲームクライアントとゲームバックエンドを更新してプレイヤーゲートウェイと統合する必要があります。ゲームバックエンドはリレーエンドポイントとプレイヤーゲートウェイトークンを取得し、ゲームクライアントに提供します。ゲームクライアントは、すべての UDP トラフィックをこれらのリレーエンドポイントに送信します。

統合は次の呼び出しパスに従います。

1. ゲームバックエンドは `GetPlayerConnectionDetails` API を呼び出して、ゲームセッションの各プレイヤーのリレーエンドポイントとプレイヤーゲートウェイトークンを取得します。

1. ゲームバックエンドは、リレーエンドポイントとプレイヤーゲートウェイトークンをゲームクライアントに送信します。

1. ゲームクライアントは、すべての送信 UDP パケットにプレイヤーゲートウェイトークンを付加し、そのパケットをリレーエンドポイントに送信します。

1. リレーネットワークはプレイヤーゲートウェイトークンを検証し、トラフィックをゲームサーバーにルーティングします。

1. ゲームサーバーは、同じリレーパスを介してトラフィックをゲームクライアントに送り返します。

## バックエンド統合
<a name="ddos-protection-integrate-backend"></a>

ゲームバックエンドは `GetPlayerConnectionDetails` API を呼び出して、プレイヤーのリレーエンドポイントとプレイヤーゲートウェイトークンを取得する必要があります。その後、バックエンドはこの情報をゲームクライアントに提供します。

### GetPlayerConnectionDetails API
<a name="ddos-protection-integrate-backend-api"></a>

`GetPlayerConnectionDetails` API は、ゲームセッションのプレイヤーの接続の詳細を返します。

リレーエンドポイントとトークン  
プレイヤーゲートウェイが有効で、 ロケーションでサポートされている場合、 は以下を返します。  
+ **リレーエンドポイント** – プレイヤーによって異なる複数のリレーエンドポイント (IP アドレスとポート)
+ **プレイヤーゲートウェイトークン** – クライアントがすべての UDP パケットの前に付加する必要があるトークン (少なくとも 3 分間有効)
+ **有効期限** – プレイヤーゲートウェイトークンの有効期限タイムスタンプ

直接接続  
プレイヤーゲートウェイが ロケーションで有効になっていないか、サポートされていない場合、 はゲームサーバーの IP アドレスとポートを返します。

ゲームクライアントは、両方の接続タイプを処理するように設計されている必要があります。

API コールの例:

```
// C++ example using AWS SDK
Aws::GameLift::GameLiftClient client;
Aws::GameLift::Model::GetPlayerConnectionDetailsRequest request;
request.SetGameSessionId(gameSessionId);
request.SetPlayerIds(playerIds);  // Vector of player IDs

auto outcome = client.GetPlayerConnectionDetails(request);
if (outcome.IsSuccess()) {
    auto result = outcome.GetResult();
    auto connectionDetails = result.GetPlayerConnectionDetails();
    
    // Process each player's connection details
    for (const auto& detail : connectionDetails) {
        std::string playerId = detail.GetPlayerId();
        
        // Get relay endpoints (IP address and port)
        auto endpoints = detail.GetEndpoints();
        for (const auto& endpoint : endpoints) {
            std::string ipAddress = endpoint.GetIpAddress();
            int port = endpoint.GetPort();
        }
        
        // Get player gateway token
        auto token = detail.GetPlayerGatewayToken();
        
        // Get expiration time
        auto expiration = detail.GetExpiration();
        
        // Send endpoints and token to game client
    }
}
```

*Amazon GameLift Servers API リファレンス*の[GetPlayerConnectionDetails](https://docs.aws.amazon.com/gameliftservers/latest/apireference/API_GetPlayerConnectionDetails.html)」を参照してください。

### リレーエンドポイントを更新する
<a name="ddos-protection-integrate-backend-refresh"></a>

リレーエンドポイントが異常になったときに`GetPlayerConnectionDetails`、定期的に を呼び出して更新されたエンドポイントをプレイヤーに提供します。ゲームセッションのすべてのプレイヤーに対して 60 秒ごとに API を呼び出すことをお勧めします。API の使用を最適化するには、1 回の API コールで複数のプレイヤー IDs をバッチ処理します。

**重要**  
定期的な更新呼び出しは、更新されたエンドポイントをプレイヤーに配信するための主要なメカニズムです。プレイヤーゲートウェイトークンは少なくとも 3 分間有効ですが、60 秒ごとに更新すると、プレイヤーは定期的に更新されたエンドポイントを受信します。

## クライアント統合
<a name="ddos-protection-integrate-client"></a>

ゲームクライアントは、すべての送信 UDP パケットにプレイヤーゲートウェイトークンを付加し、提供されたリレーエンドポイントにパケットを送信する必要があります。Amazon GameLift Servers クライアント SDK for C\$1\$1 および Unreal Engine は、この統合を簡素化するためのユーティリティを提供します。

### クライアント要件
<a name="ddos-protection-integrate-client-requirements"></a>

プレイヤーゲートウェイを介してトラフィックをルーティングするには、ゲームクライアントが以下を行う必要があります。
+ **プレイヤーゲートウェイトークンを準備 –** すべての送信 UDP パケットにプレイヤーゲートウェイトークンを準備します。プレイヤーゲートウェイトークンは暗号化してはならず、各パケットの先頭に表示される必要があります。有効なプレイヤーゲートウェイトークンがないパケットは削除されます。
+ **リレーエンドポイントに送信する** – すべての UDP パケットを指定されたリレーエンドポイントに送信します。
+ **接続アクティビティを維持する** – ゲームクライアントがゲームサーバーにパケットを送信するか、ゲームサーバーが少なくとも 30 秒に 1 回、プレイヤーにパケットを送信することを確認します。このアクティビティは、リレーネットワークを介した接続を維持します。
+ **エンドポイントの更新を処理する** – 更新されたリレーエンドポイントとプレイヤーゲートウェイトークンをバックエンドから受け入れ (60 秒ごとに推奨）、接続を中断せずに新しいエンドポイントに移行します。

### クライアント SDK
<a name="ddos-protection-integrate-client-sdk"></a>

Amazon GameLift Servers クライアント SDK for C\$1\$1 および Unreal Engine は、プレイヤーゲートウェイの統合を簡素化するユーティリティを提供します。
+ **トークン管理** – すべての送信 UDP パケットにプレイヤーゲートウェイトークンを付加します。
+ **エンドポイントの選択** — 設定可能なアルゴリズムを使用してトラフィックをリレーエンドポイントにルーティングします。
+ **エンドポイントの更新** – 定期的なコールバックをスケジュールして、更新されたリレーエンドポイントとプレイヤーゲートウェイトークンをバックエンドから取得します。

### エンドポイント選択アルゴリズム
<a name="ddos-protection-integrate-client-algorithms"></a>

クライアント SDK には、使用するリレーエンドポイントを選択するための 2 つの組み込みアルゴリズムが用意されています。

フォールバックアルゴリズム  
1 つのエンドポイントが異常になるまで使用し、別のエンドポイントに切り替えます。短時間の中断が許容されるメニュー、ロビー、ターンベースのゲームに最適です。エンドポイントのフェイルオーバー中に、設定されたタイムアウト期間 (デフォルト: 2 秒) パケットが失われる可能性があります。

予測ローテーションアルゴリズム  
利用可能なすべてのエンドポイントを継続的にローテーションし、障害が発生する前に障害を予測します。一貫したパケット配信が重要なファーストパーソンシューティングゲームやレースゲームなどのリアルタイムのゲームプレイに最適です。ゲームサーバーは、一貫した頻度でメッセージを送信する必要があります。

SDK のベースアルゴリズムクラスを拡張することで、カスタムアルゴリズムを実装することもできます。

### クライアント SDK リソース
<a name="ddos-protection-integrate-client-resources"></a>

完全な統合手順とサンプルコードについては、次のリソースを参照してください。

C\$1\$1  
クライアント SDK for C\$1\$1 は[Amazon GameLift Servers、クライアント SDK for C\$1\$1 ](https://github.com/amazon-gamelift/amazon-gamelift-servers-client-sdk-for-cpp)で利用できます。

Unreal Engine  
Unreal Engine 用プラグインは、[Amazon GameLift Serversクライアント SDK for Unreal Engine ](https://github.com/amazon-gamelift-for-unreal/amazon-gamelift-servers-client-sdk-for-unreal)で利用できます。アクセスには、GitHub の Epic Games 組織にメンバーシップが必要です。詳細については、[GitHub の「Unreal Engine](https://www.unrealengine.com/en-US/ue-on-github)」を参照してください。

## 統合をテストする
<a name="ddos-protection-integrate-testing"></a>

フリートにデプロイする前に、プレイヤーゲートウェイテストツールを使用してプレイヤーゲートウェイの統合をローカルでテストします。このツールは、プレイヤーゲートウェイ UDP プロキシインフラストラクチャをシミュレートし、ゲームクライアントがプレイヤーゲートウェイトークンの先頭を正しく付加し、複数のエンドポイントを介してトラフィックをルーティングし、ネットワークの低下を処理することを確認するのに役立ちます。

セットアップと使用方法については、GitHub の[プレイヤーゲートウェイテストアプリ](https://github.com/amazon-gamelift/amazon-gamelift-toolkit/tree/main/player-gateway-testing-app)を参照してください。

## ベストプラクティス
<a name="ddos-protection-integrate-best-practices"></a>

プレイヤーゲートウェイを統合するときは、次のベストプラクティスに従ってください。
+ **60 秒ごとにエンドポイントを更新する** – 60 秒`GetPlayerConnectionDetails`ごとに を呼び出して、プレイヤーが定期的に更新されたエンドポイントを受信できるようにします。
+ **バッチ API コール** – 同じゲームセッションで複数のプレイヤー`GetPlayerConnectionDetails`に対して を呼び出す場合は、呼び出しを一括して API オーバーヘッドを減らします。
+ **接続アクティビティを維持する** – ゲームクライアントとゲームサーバー間のトラフィックが少なくとも 30 秒に 1 回流れることを確認します。これは、client-to-serverトラフィックまたはserver-to-clientトラフィックのいずれかです。
+ **エンドポイントの更新を適切に処理**する – ゲームクライアントがバックエンドから更新されたエンドポイントを受け取ったら、プレイヤーの接続を切断せずに新しいエンドポイントに移行します。
+ **適切なアルゴリズムを選択する** – ゲームの要件に最も適したエンドポイント選択アルゴリズムを選択します。ターンベースのゲームにはフォールバックアルゴリズムを使用し、リアルタイムゲームには予測ローテーションアルゴリズムを使用します。