Unity multiplayer game on GameLift #1

Unityで作成したマルチプレイヤーゲームをGameLiftで動かしてみました!!
このシリーズでは、GameLiftを利用するために必要なアプリケーション側での振る舞いをサンプルコードを交えながら紹介していきます。

ドキュメントだけでは理解しにくい箇所も、実際にゲームを作って動かしてみるとクリアになると思います。「GameLift、気になるけどよくわかならいなー」と思って手を出せずにいる方は是非試してみてください。

GameLiftにデプロイするゲームはUnity公式チュートリアルのマルチプレーヤゲームをベースとしています。

GameLiftの機能を使って、マルチプレーヤゲームに対し以下の機能を追加していきます。

  • ルーム作成
  • ルーム一覧表示
  • ルームへの接続

範囲

*の箇所が第1回の範囲です。

  • *全体構成の説明
  • サーバーサイドアプリ実装のポイント
  • クライアントサイドアプリ実装のポイント
  • API Gateway + Lambda実装のポイント
  • GameLiftへのデプロイ
  • ゲームプレイ

全体構成の説明

構成は以下の通りです。


この構成図に登場する各ロールの目的/役割について説明してきます。※構成図にgame sessionとroomという単語が出てきますが意味するところは同じだと思ってください。

GameClient

Unity(C#)で作成したGameClientです。以下の機能を実装しています。

  • ルーム作成
  • ルーム一覧表示
  • ルームへの接続
  • ゲームをプレイ

「ルームの作成」、「ルームの表示」の部分は、API Gatewayに対してhttpリクエストを送信することで実現しています。「ルームの作成」リクエストに必要な情報はルーム名と送信先のエンドポイント、「ルームの表示」リクエストに必要な情報は送信先のエンドポイントとなります。

「ルームへの接続」の部分は基本的に公式チュートリアル(unetの機能)をそのまま利用していますが、GameClientが送信するGameServerに対するPlayer追加リクエストについては一部改修しています。ここの部分については、次回以降で詳しく説明します。

「ゲームをプレイ」の部分は公式チュートリアルのまま特に変更はありません。

API Gateway

GameClientからhttpリクエストを受け付けるためのエンドポイントです。各エンドポイントにはそれぞれLambdaファンクションが割り当てられており、リクエスト受信時にはそれらのファンクションが実行されます。

今回作成するエンドポイントは以下の3つです。

  • ルーム作成用のエンドポイント
  • ルーム一覧取得用のエンドポイント
  • プレイヤーセッションID作成用のエンドポイント

API GatewayとLambdaの連携については以下のブログが参考になります。

Lambda

GameLiftを操作するためのファンクションになります。作成するLambdaファンクションは以下の3つです。

  • ルーム作成用のLambdaファンクション
  • ルーム一覧取得用のLambdaファンクション
  • プレイヤーセッションID作成用のLambdaファンクション

LambdaファンクションにはGameLiftを操作するためのロールを付与し、boto3を使ってGameLiftに対する操作を行います。

GameLift Service

GameLift Fleet(Game Server)を管理するためのサービスです。Lambdaファンクションからリクエストがあった場合には、そのリクエストに応じて必要な情報(Game ServerのIPアドレスやPort)をリクエスト元に返却します。

また、GameLift ServiceはGameLift Fleetと各フェーズ毎に通信をしており、ゲームセッション数(ルーム数)やプレイヤーセッション数など常に最新の状態を管理しています。GameLift Serviceが保持する情報はマネジメントコンソールから確認することもでき、EC2インスタンスをスケールさせるためのトリガーを定義することも可能です。

GameLift Fleet(Game Server)

マルチプレイヤーゲームのサーバーサイドアプリをホストするためのリソースです。実態としてはEC2インスタンスの集合で、EC2インスタンスの内部ではゲームプロセスが実行されています。

GameLift SDK v3.x 以降を利用している場合、EC2インスタンス1台には最大50までゲームプロセスをホストすることができます。また、1つのゲームプロセスは1つのルームを管理することができ、そして、1つのルームには最大200人のプレイヤーが接続できます。

ややわかりにくいですが以下のようなイメージになります。


今回は、2つのEC2インスタンスにそれぞれ2つのゲームプロセスを起動させて4つのルームを管理します。

まとめ

GameLiftを利用するための全体の構成を確認しました。次回はアプリケーション実装のポイントを紹介しようと思います。