Amazon GameSparks(preview)のMessage機能をブラウザ上でテストしてみた

2022.11.04

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Amazon GameSparksを使用することで、ゲームクライアントとゲームサーバの双方向通信を簡単に実装できますが、GameSparks上に書いたコードの動作確認をするために、毎回ゲームクライアント側にGameSparksで生成したコードを組み込むのは少し面倒くさいです。

GameSparksには、ブラウザ上でMessageのコードをテスト実行するTest harnessという機能があります。この機能を使えば、コードの動作確認をGameSparks内で完結することができます。

Test harnessの画面

GameSparksのマネジメントコンソールにて、各ゲームプロジェクト->Dev->Test harnessと開いていくと、上のようなTest harnessの専用画面が表示されます。

画面左のMessagesの中に、デフォルトで用意されているMessageの他に、自分で作成したMessageもCustomディレクトリ以下に表示されます。
なお、各Messageの設定画面でEnable client permissionにチェックを付け、クライアントからのメッセージ呼び出しを許可しないと、Messageがこの画面で表示されないためご注意ください。

画面中央のRequest bodyの中にMessageのリクエストパラメータをJSON形式で入力し、Send messageボタンをクリックすることでMessageが実行されます。処理の結果は、画面右のLog inspectorに表示されます。

EventとNotificationのテスト

それでは、実際にTest harness機能を使っていきたいと思います。

過去のこちらの記事で作成した実績機能のEventとNotificationについて、Test harnessでのテストをしてみます。
これらの機能は以下の仕様をもとに作成されています。

  • ゲームサーバは、クライアントからクリックの情報が届くたびに合計クリック数を加算する
  • ゲームサーバは、合計クリック数が実績解除の条件(5回)を達成したらゲームクライアントへ通知する

Event

Eventのハンドラでは、クライアントから呼び出されるたびにクリック数を加算する処理を実装しています。実際のコードは以下の通りです。

GameSparks().Logging().Debug("クリックイベントハンドラ起動");

let data = GameSparks().CurrentPlayer().GetData(["Clicked"]);

// 値が未定義の場合初期化
if (data.Clicked === undefined) {
  data.Clicked = 0;
}

data.Clicked++;

GameSparks().CurrentPlayer().SetData(data);

Test harnessにてこのMessageのテストを行います。

何も値を送る必要はないため、Request bodyは空のJSONです。
Send messageボタンをクリックすると、Log inspectorに以下のように表示されます。

Eventはクライアントへのレスポンスを送る機能はなく、またコード上でNotificationの送信も行っていないため、Message送信の完了を意味するログしか表示されません。

Notification

Clicked Eventのハンドラでは先程の機能とは別に、合計クリック数が条件を満たしたら実績達成のNotificationを送る処理も実装しています。こちらも、Send messageボタンを押すたびに処理が呼び出されています。

コードは以下の通りです。

GameSparks().Logging().Debug("実績解除通知イベントハンドラ起動");

let data = GameSparks().CurrentPlayer().GetData(["Clicked"]);

// 値が未定義の場合初期化
if (data.Clicked === undefined) {
  data.Clicked = 0;
}

if(data.Clicked >= 5) {
  GameSparks().CurrentPlayer().SendNotification(
    "Custom.Game.AchievementUnlocked",
    {
      "title": "クリッカー初級者",
      "isUnlocked": true
    }
  );
}

コードの通り、合計クリック数が5回を超えるまでは何もしないため、先ほどのテストの時も反応はありませんでした。しかし、Send messageボタンを5回以上押し、永続化されている合計クリック数が5回を超えると、以下のような反応を返すようになります。

Log inspectorにNotification receivedというテキストともに新しい種類のログが表示されました。

CategoryはNotificationで、先程のコードでSendNotification()に渡したJSON形式のデータも入っています。これが、Notificationの内容を確認するためのログです。

なお、Test harnessにはMessageの送受信結果しか表示されませんが、Debug()などで出力しているログは、以下のようにCloudWatchにて見ることができます。

Requestのテスト

次に、Requestのテストを行います。

EventとNotification同様、以前作成した実績機能でもRequestを作成しましたが、パラメータをセットする必要のないコードでした。

今回は、リクエストの内容によって実行結果が変わることを確認したいので、新しいRequest Messageを作成します。

仕様としては、以下のとおりです。

  • ゲームサーバは、Player作成Requestを受けたらそのパラメータを元に新しいPlayer情報をサーバに追加保存し、レスポンスとして今まで作成した全てのPlayer情報をListで返却する

なお、Player情報はこちらの記事で作成したデータ型と類似のものを使用します。

Requestに対応するハンドラのコードは以下のとおりです。仕様の通り、受け取ったパラメータを元にPlayerを新しく作成して保存。その後、Playerのリストをレスポンスとして返却しています。

GameSparks().Logging().Debug("プレイヤーデータ登録リクエスト");

let data = GameSparks().CurrentPlayer().GetData(["players"]);

if (data.players === undefined) {
  data.players = [];
}

data.players.push(message.player);
GameSparks().CurrentPlayer().SetData(data);

return GameSparks().Messaging().Response(
  {
    "players": data.players,
  }
);

このRequestをTest harnessでテストした結果が以下の画像です。

Request bodyに渡したplayer情報が、Log inspectorにRequest sentのテキストともに表示されています。

一方で、レスポンス結果はResponse receivedという形でログに表示されています。Playerのリストには、Request bodyの値と同じ内容のデータがあります。
違う内容のデータも返却されていますが、これは事前に同様の方法で永続化した別のPlayer情報です。

まとめ

Test harness機能を使って、ブラウザからマネジメントコンソール経由でMessageをテストする方法を書きました。

この機能を使うことで、コードの変更の都度ゲームクライアント経由で動作確認をするよりも、素早くテストを行うことが可能となるでしょう。