リアルタイムサーバー用のゲームクライアントの統合 - Amazon GameLift

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

リアルタイムサーバー用のゲームクライアントの統合

このトピックでは、Amazon GameLift がホストするゲームセッションに参加できるようにゲームクライアントを準備する方法について説明します。

ゲームクライアントを準備するために必要なタスクは 2 セットあります。

  • 既存のゲームに関する情報の取得、マッチメーキングのリクエスト、新しいゲームセッションの開始、およびプレイヤー用のゲームセッションスロットの予約を行うようにゲームクライアントを設定します。

  • ゲームクライアントがリアルタイムサーバーでホストされているゲームセッションに参加してメッセージを交換できるようにします。

ゲームセッションとプレイヤーセッションを検索または作成します。

ゲームセッションを作成または開始し、FlexMatch マッチメーキングをリクエストし、プレイヤーセッションを作成してゲーム内のプレイヤーのスペースを予約するようにゲームクライアントを設定します。ベストプラクティスは、バックエンドサービスを作成しておき、それを使用して、ゲームクライアントのアクションによって Amazon GameLift サービスがトリガーされたときに、そのサービスに直接リクエストを送信することです。その後、バックエンドサービスは該当するレスポンスをゲームクライアントに中継します。

  1. AWS SDK をゲームクライアントに追加し、Amazon GameLift クライアントを初期化して、フリートおよびキューでホスティングリソースを使用するように設定します。AWS SDK はいくつかの言語で使用可能です。Amazon GameLift SDK を参照してくださいカスタムクライアントサービスの場合

  2. バックエンドサービスに GameLift 機能を追加します。詳細な手順については、「ゲームクライアント GameLift に Amazon を追加する」を参照してください。そしてFlexMatch マッチメーキングを追加してください。ベストプラクティスは、ゲームセッションの配置を使用して新しいゲームセッションを作成することです。この方法では、GameLift の新しいゲームセッションをすばやくインテリジェントに配置できるだけでなく、プレイヤーのレイテンシーデータを使用してゲームのラグを最小限に抑えることができます。最低限、バックエンドサービスは新しいゲームセッションをリクエストし、それに応じてゲームセッションデータを処理できる必要があります。また場合によっては、既存のゲームセッションを検索して情報を取得し、プレイヤーセッションをリクエストして、既存のゲームセッションで効果的にプレイヤースロットが予約されるようにする機能を追加する必要があります。

  3. 接続情報をゲームクライアントに返します。バックエンドサービスに応じて、ゲームセッションオブジェクトとプレイヤーセッションオブジェクトを受け取る Amazon GameLift サービスにリクエストします。これらのオブジェクトには、Realtime Server で実行されているゲームセッションにゲームクライアントが接続するために必要な情報、特に接続の詳細 (IP アドレスおよびポート) とプレイヤーセッション ID が含まれています。

リアルタイムサーバーでゲームに接続する

ゲームクライアントがリアルタイムサーバー上のホスト型ゲームセッションに直接接続し、サーバーや他のプレイヤーとメッセージを交換できるようにします。

  1. リアルタイムクライアント SDK を入手して構築し、それをゲームクライアントプロジェクトに追加します。SDK の要件およびクライアントライブラリの構築方法については、README ファイルを参照してください。

  2. 使用するクライアント/サーバー接続のタイプをクライアント設定で指定して Client() を呼び出します。

    注記

    TLS 証明書の生成が有効になっているセキュリティ保護ありのフリートで実行されている Realtime サーバーに接続する場合は、セキュリティ保護ありの接続タイプを指定する必要があります。

  3. ゲームクライアントに次の機能を追加します。詳細については、「リアルタイムサーバー API (C#) リファレンス」を参照してください。

  4. 必要に応じてクライアントコールバック用のイベントハンドラを設定します。「リアルタイムサーバークライアント API (C#) リファレンス: 非同期コールバック」を参照してください。

TLS 証明書の生成が有効になっているリアルタイムフリートを使用する場合、サーバーは TLS 証明書を使用して自動的に認証されます。TCP および UDP トラフィックは、トランスポートレイヤーセキュリティを提供するために、転送時に暗号化されます。TCP トラフィックは TLS 1.2 を使用して暗号化され、UDP トラフィックは DTLS 1.2 を使用して暗号化されます。

ゲームクライアントの例

基本的なリアルタイムクライアント (C#)

この例は、基本的なゲームクライアントとリアルタイムクライアント SDK (C#) の統合を示しています。図に示すように、この例では、リアルタイムクライアントオブジェクトを初期化し、イベントハンドラを設定します。またクライアントサイドコールバックを実装し、リアルタイムサーバーに接続して、メッセージを送信して切断します。

using System; using System.Text; using Aws.GameLift.Realtime; using Aws.GameLift.Realtime.Event; using Aws.GameLift.Realtime.Types; namespace Example { /** * An example client that wraps the GameLift Realtime client SDK * * You can redirect logging from the SDK by setting up the LogHandler as such: * ClientLogger.LogHandler = (x) => Console.WriteLine(x); * */ class RealTimeClient { public Aws.GameLift.Realtime.Client Client { get; private set; } // An opcode defined by client and your server script that represents a custom message type private const int MY_TEST_OP_CODE = 10; /// Initialize a client for GameLift Realtime and connect to a player session. /// <param name="endpoint">The DNS name that is assigned to Realtime server</param> /// <param name="remoteTcpPort">A TCP port for the Realtime server</param> /// <param name="listeningUdpPort">A local port for listening to UDP traffic</param> /// <param name="connectionType">Type of connection to establish between client and the Realtime server</param> /// <param name="playerSessionId">The player session ID that is assigned to the game client for a game session </param> /// <param name="connectionPayload">Developer-defined data to be used during client connection, such as for player authentication</param> public RealTimeClient(string endpoint, int remoteTcpPort, int listeningUdpPort, ConnectionType connectionType, string playerSessionId, byte[] connectionPayload) { // Create a client configuration to specify a secure or unsecure connection type // Best practice is to set up a secure connection using the connection type RT_OVER_WSS_DTLS_TLS12. ClientConfiguration clientConfiguration = new ClientConfiguration() { // C# notation to set the field ConnectionType in the new instance of ClientConfiguration ConnectionType = connectionType }; // Create a Realtime client with the client configuration Client = new Client(clientConfiguration); // Initialize event handlers for the Realtime client Client.ConnectionOpen += OnOpenEvent; Client.ConnectionClose += OnCloseEvent; Client.GroupMembershipUpdated += OnGroupMembershipUpdate; Client.DataReceived += OnDataReceived; // Create a connection token to authenticate the client with the Realtime server // Player session IDs can be retrieved using AWS SDK for GameLift ConnectionToken connectionToken = new ConnectionToken(playerSessionId, connectionPayload); // Initiate a connection with the Realtime server with the given connection information Client.Connect(endpoint, remoteTcpPort, listeningUdpPort, connectionToken); } public void Disconnect() { if (Client.Connected) { Client.Disconnect(); } } public bool IsConnected() { return Client.Connected; } /// <summary> /// Example of sending to a custom message to the server. /// /// Server could be replaced by known peer Id etc. /// </summary> /// <param name="intent">Choice of delivery intent i.e. Reliable, Fast etc. </param> /// <param name="payload">Custom payload to send with message</param> public void SendMessage(DeliveryIntent intent, string payload) { Client.SendMessage(Client.NewMessage(MY_TEST_OP_CODE) .WithDeliveryIntent(intent) .WithTargetPlayer(Constants.PLAYER_ID_SERVER) .WithPayload(StringToBytes(payload))); } /** * Handle connection open events */ public void OnOpenEvent(object sender, EventArgs e) { } /** * Handle connection close events */ public void OnCloseEvent(object sender, EventArgs e) { } /** * Handle Group membership update events */ public void OnGroupMembershipUpdate(object sender, GroupMembershipEventArgs e) { } /** * Handle data received from the Realtime server */ public virtual void OnDataReceived(object sender, DataReceivedEventArgs e) { switch (e.OpCode) { // handle message based on OpCode default: break; } } /** * Helper method to simplify task of sending/receiving payloads. */ public static byte[] StringToBytes(string str) { return Encoding.UTF8.GetBytes(str); } /** * Helper method to simplify task of sending/receiving payloads. */ public static string BytesToString(byte[] bytes) { return Encoding.UTF8.GetString(bytes); } } }