GameLift RealtimeServer SampleGame「MegaFrogRace」を動かしてみた ~ネット対戦編~

2020.12.13

どうも、コンサルティング部の後藤です。

皆さん、Mega Frog Raceをご存じでしょうか?Mega Frog RaceはGameLiftのRealtimeServerの機能を試すことが出来るサンプルゲームになります。

前回の記事でローカル対戦を試せるところまでやってみました。本記事はGameLift RealtimeServerを使用してマッチングを行い、MegaFrogRaceをネット対戦(1人で)を行うところまで試した記事になります。

前回の記事を読んでから読み進めること推奨です。

GameLift RealtimeServer SampleGame「MegaFrogRace」を動かしてみた ~ローカル対戦編~

今回構築する構成に関して

現在、ローカル環境でMegaFrogRaceを実行までは出来ています。今回はMegaFrogRaceのクライアントからCognitoに認証を行い、Lambdaを使用してGameLiftに対してセッションを張って2人揃ったらゲームが始まるような仕組みを作っていきます。

以下の図ではCognitoが抜けていますが、イメージとしては以下のような構成になります。

GameLift構築

スクリプト設定

まず、GameLiftのフリートを作成するためにスクリプトを設定します。スクリプトはMegaFrogRaceのソースコード内にあるServerApp\MegaFrogRaceServer.jsと、こちらから取得できるgameloop.jsをまとめてzip圧縮したものを使用します。

今回はスクリプトの名前をMegaFrogRaceServer、バージョンを1.00として設定しています。

スクリプトコードはZipファイルを選択して、先程圧縮したzipファイルを選択してください。

フリート設定

スクリプトが作成出来たら、次はフリートを作成していきます。

フリートの詳細は以下の通りに設定しています。バイナリ型はスクリプトを選択、先程作成したスクリプトを選択してください。

インスタンスタイプに関してはc5.largeで問題ありません。

プロセス管理の設定では、以下のように設定します。設定後、右にある緑マークをクリックしてください。

  • 起動パス : /local/game/MegaFrogRaceServer.js
  • 起動パラメータ : nothing
  • 同時プロセス : 1

「フリートの初期化」をクリックすることでフリートが作成されます。フリートがアクティブになるまでは少し時間が掛かります。

Lambda設定

MegaFrogRaceのソースコードAWS\ClientServiceLambda.jsが今回使用するLambdaのコードになります。

しかし、こちらNode.js 8.10仕様となっており、ブログ執筆時には既にLambdaでNode.js 8.10は動かすことが出来ません。そのため、こちらのコードをNode.js 12.xで動かせるように少し弄る必要があります。

Node.js 8.10と12.xの大きな違いはモジュールが読み込めないことです。aws-sdkはLambdaから読み込むことが出来ますが、今回uuidを使用するため、uuidをnpmで持ってきてあげる必要があります。

以下、Amazon Linux2でNode.js / npm / uuid を導入するまでの手順となります。

Node.js / npm導入
$ curl -sL https://rpm.nodesource.com/setup_12.x | sudo bash -
$ sudo yum install --enablerepo=nodesource nodejs

uuid取得
$ npm install uuid

また、ClientServiceLambda.jsの中身も少し弄る必要があります。今回は以下の部分を変更しました。

3行目
const uuid = require('uuid'); を以下に変更
const {"v4": uuidv4} = require('uuid');

5,7行目
const GameLift = new AWS.GameLift({region: 'ap-south-1'}); //使用しているリージョンに変更
const MegaFrogRaceFleetID = "fleet-00aaaa00-a000-00a0-00a0-aa00a000aa0a"; //作成したフリートIDに変更

63行目
PlayerId: uuid.v4() を以下に変更
PlayerId: uuidv4()

uuid取得、コードの変更が完了したらそれらをzipにまとめる

$ ls
index.js node_modules package-lock.json
$ ls node_modules/
uuid
$ zip -r function.zip .

コードの準備が出来たら、Lambdaを作成していきます。

Lambdaは一から作成、関数名は「ConnectClientToServer」で設定して、ランタイムはNode.js 12.xを指定してください。

Lambda関数を作成致しましたら、次にIAMロールの設定を行います。デフォルトのIAMロールにはGameLiftへの権限が無いため、以下を許可するIAMポリシーを作成する必要があります。

  • gamelift:CreateGameSession
  • gamelift:CreatePlayerSession
  • gamelift:SearchGameSessions
  • gamelift:DescribeGameSessions
IAMロールの設定が完了し、Lambdaデプロイが出来たら空のテストを実行して以下のようにプレイヤーセッションIDやゲームセッションIDが取得出来れば成功です。

Lambdaの実行結果が失敗していたり、成功しているがStatusで400の返答がある場合は失敗しているためLambdaのコードを見直してみてください。

Cognito設定

クライアントが認証するためにCognitoを使用します。

Cognitoの画面からIDプール作成を選択、IDプール名をMegaFrogRaceAnonPool、「認証されていないIDに対してアクセスを有効にする」にチェックを入れてください。

また、認証されていない場合のIAMロールを以下のように変更します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Invoke",
            "Effect": "Allow",
            "Action": [
                "lambda:InvokeFunction"
            ],
    //↓はご自身のアカウントに合わせて要変更
            "Resource": "arn:aws:lambda:ap-northeast-1:xxxxxxx:function:ConnectClientToServer" 
        },
        {
            "Effect": "Allow",
            "Action": [
                "mobileanalytics:PutEvents",
                "cognito-sync:"
            ],
            "Resource": [
                ""
            ]
        }
    ]
}

Cognitoが作成出来たらサンプルコードにてプラットフォーム.Netに選択し、AWS認証情報部分をメモしておきます。後々使います。

これで、AWS側の設定は完了となります。

RTSClient.csのコード修正

クライアント側が上記CognitoやLambdaを見つけられるようにMegaFrogScript/Race/Assets/Scripts/RTSClient.csを弄っていきます。

編集部分は以下の通りです。

237行目 ~ 250行目
AWSConfigs.AWSRegion = "us-east-1"; // 使用しているリージョンを指定
AWSConfigs.HttpClient = AWSConfigs.HttpClientOption.UnityWebRequest;
// paste this in from the Amazon Cognito Identity Pool console
CognitoAWSCredentials credentials = new CognitoAWSCredentials(
"us-east-1:a00a0aa0-a000-0000-0aa0-0aa00a0009a0", // 上記CognitoIDを記載
RegionEndpoint.USEast1 // 使用しているリージョンを指定
);
AmazonLambdaClient client = new AmazonLambdaClient(credentials, RegionEndpoint.USEast1); // Lambdaリージョンを指定
InvokeRequest request = new InvokeRequest
{
FunctionName = "ConnectClientToServer", //Lambda名を変更していたら、こちらも変更
InvocationType = InvocationType.RequestResponse
};

コードの修正が出来たら、前回同様UnityでMageFrogRaceをビルドします。

ネット対戦してみる

はい、遂にGameLiftと接続してMegaFrogRaceでネット対戦できます!

再ビルドを行ったMegaFrogRace.exeをまず1窓で開き、QUITからGameLiftを選択します。するとWaiting for Other player..と表示されます。

そうしたらもう一度、MegaFrogRace.exeを起動して2窓でMegaFrogRaceを開きます。セッションに成功すると、2画面でゲームを行うことが出来、リアルタイムにゲームが進行している様子が見れると思います。

また、GameLiftのフリートを確認すると・・・

セッション中のもの、終了しているものが見れると思います。

まとめ

GameLift RealtimeServer SampleGame MegaFrogRaceをローカル対戦、ネット対戦どちらもやってみました。MegaFrogRace自体少々古く、今行うと色々修正必要な個所が多くて動かすまで大変でした。しかし、GameLiftはゲームありきのサービスとなっているため、このようにサンプルゲームを提供して頂けるとRealtimeServerの動作確認だけにとどまらず、様々な検証を行うことが出来るのかなと思いました。

この記事が何方かのお役に立てば幸いです。