AWS GameKit plugin for Unreal Engineを使ってみた

2022年3月に発表があったAWS GameKit plugin for Unreal EngineをUnrealEngine4のプロジェクトに組み込んで使ってみました
2022.04.14

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

AWSよりAWS GameKitというサービスが公開されました。このサービスを利用することによりUnrealEngine(以降、UEと表記)で開発されたゲームに対して、ユーザ登録、ログイン、ゲーム情報の保存といった機能が手軽に実装できます。

UE4ユーザとして、一度試してみなくては!ということで、AWS GameKitを使ってみました。

AWS GameKitとは

あらためてAWS GameKitについて解説します。このAWS GameKitはUE向けのプラグインとして提供されています。AWSの各種サービス(例えばLambda、DynamoDBなど)に詳しくなくてもゲームに必要な環境がAWSに構築でき、開発者はUEで必要な機能を実装するだけで機能が実現できるサービスです。

このAWS GameKitを利用することで実現できる機能は、現時点では次の通りです。

  • ユーザ登録・認証
  • アチーブメント(報酬)
  • ゲーム情報のセーブ
  • ゲームデータのクラウド保存

GameKit自体は無料ですので、AWSの各種サービス利用料金のみ発生します。またAWS GameKitで使われているソースコードやサンプルコードはすべてgithubで公開されていますので、自由に機能を追加することも可能です。

裏側の仕組み

通常、ユーザ登録、ログイン機能を実装するためにはAWS側に何かしらのAPIやデータベース等などを設計し、環境を構築する必要があります。が、AWS GameKitでは、それらのAPIやデータベースの構築などは、GameKitにあらかじめ用意された定義(CloudFormationで行います)を元に構築する仕組みとなっています。また、APIやデータベースの構築の指示はすべてUEのGameKitプラグインから行うので、AWSコンソールにログインする必要はありません。

このブログでは、簡単に手順を解説しています。詳細なドキュメントは、AWS GameKitに書かれています。

準備

AWS GameKitを利用するために以下の環境を用意しました。

  • UE 4.27
  • VisualStudio 2019

AWS GameKitはUEの最新版のみ対応する予定となっています。今回は4.27を利用しています。またこのプラグインを利用するには C++のコードをビルドするため、Visual Studio 2019が必要です。

VisualStudio 2019とあわせて、いくつかのライブラリ、コンポーネントをインストールする必要があります。それらはInstall the AWS GameKit plugin - AWS GameKitに書かれています。

AWS GameKitをダウンロードする

では実際にUEのプロジェクトを作成し AWS GameKitを利用できるよう設定していきます。

AWS GameKitは、AWS GameKitから、”Download AWS GameKit plugin for Unreal Engine”のバナーをクリックしてダウンロードします。現時点では、AwsGameKitUnrealPlugin_Windows_v1.0.0.zipというファイルがダウンロードされます。

次に UEのプロジェクトを作成します。何でもよいのですが、ここではFirstPersonのプロジェクトで作成してみました(プロジェクト名はAWSGameKitSample1としました)。プロジェクトを作成する際、C++のプロジェクトとして作成しなければなりません。

次にAWS GameKitを先に作成したプロジェクトに登録します。先にダウンロードしたAwsGameKitUnrealPlugin_Windows_v1.0.0.zipファイルを展開するとAwsGameKitフォルダが作成されます。

AwsGameKitフォルダをプロジェクトにプラグインとして登録します。プラグインとして登録する際には、<プロジェクト名>/Plugins/Marketplaceフォルダを作成した後、MarketplaceフォルダにAwsGameKitフォルダをコピーします。

今回の場合だと、AWSGameKitSample1/Plugins/Marketplaceフォルダを作成した後にAwsGameKitフォルダをコピーすることになります。

slnファイルを再構築する

AwsGameKitフォルダをコピーした後、slnファイルの再構築を実施します。

AWSGameKitSample1.slnファイルを右クリックして、Generate Visual Studio profile filesを選択すると再構築されます。

プロジェクトをビルドする

次にVisual Studioからプロジェクトのビルドを行います。AWSGameKitSample1.slnファイルを開き、Visual Studioにてソリューションのビルドを行います。

プラグイン有効化を確認

AWSGameKitSample1プロジェクトを開き、プラグインが有効化されているか確認します。基本的には有効化されているはずですが、そうでない場合はEnabledにチェックをいれましょう。

また、プロジェクトを開いた際に、”Project is out of date. Would you like to update it?”とダイアログが表示された際にはUpdateを選択してください。

表示コンテンツの表示設定

このままだとAWS GameKitに含まれているサンプルコード等が見えない状況になっています。ので、AWS GameKit中のサンプルコード等がContentBrowserから見えるように設定を変更します。

ContentBrowserの右下のView OptionsからShow Plugin Contentにチェックを入れます。

プロジェクトのソースコードを変更する

GameKitのプラグインにある機能をコードから参照できるようにするため、プロジェクトのBuild.csファイルを編集します。今回は、AWSGameKitSample1\Source\AWSGameKitSample1フォルダにあるAWSGameKitSample1.Build.csファイルを編集します。

Build.csファイル中のPublicDependencyModuleNamesとPrivateDependencyModuleNamesに、 "AwsGameKitCore", "AwsGameKitRuntime" を両方追加します。PrivateDependencyModuleNamesが存在しない場合は追加してください。

今回のプロジェクトでは、追加後は以下のようになりました。

public class AWSGameKitSample1 : ModuleRules
{
  public AWSGameKitSample1(ReadOnlyTargetRules Target) : base(Target)
  {
    PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
    PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "HeadMountedDisplay", "AwsGameKitCore", "AwsGameKitRuntime" });
    PrivateDependencyModuleNames.AddRange(new string[] { "AwsGameKitCore", "AwsGameKitRuntime" });
  }
}

AWSの設定

次にAWS側の設定を行います。AWS GameKitではユーザ管理等に必要なインフラ構築をCloudFormationで行っています。そのため、それらの実施に必要なIAMのPolicyとUserを作成しておく必要があります。

これらの設定も自動で行えますが、内容を確認するために手動で設定しました。

Policyの作成

最初にPolicyを作成します。登録するPolicyの内容は、AwsGameKitのプラグイン中にある、Resources\cloudResources\policies\GameKitDeveloperPolicy_Template.jsonファイルがベースとなります。

Policyの登録前に先のjsonファイルの内容を一部更新する必要があります。先のjsonファイル中に<YOUR_ACCOUNT_ID>と記載がある箇所がありますが、これを自分のアカウントID(9桁の数値)に置換しておかなければなりません。

ファイルの編集が終わった段階で、このjsonファイルの内容を元にAWSコンソールのIAMからAccess management > Policiesを選択、Create Policyボタンを押します。

あとは先に用意したjsonファイルを以下のように貼り付けPolicyを作成します。Policy名は任意ですが、ここではGameKitDeveloperPolicyとしました。

Userの作成

次にUserを作成します。

IAMからAccess management > Usersを選択し、Add Usersボタンを押します。

名前は任意ですが、ここではGameKitDeverloperUserとしました。

ユーザを作成する際には、Access KeyとPasswordの両方にチェックを入れます。

次に設定するパーミッションですが、先ほど作成したGameKitDeveloperPolicyのみを付与します。

そして、ユーザの作成が完了すると、アクセスキーやシークレットアクセスキーが表示されますので、それを控えておきます。それらが記載されたcsvファイルのダウンロードでもかまいません。

GameKit pluginの設定を行う

長々と設定してきましたが、もう一息です。あとGameKit pluginの設定を行います。

必要な設定としては、以下の通りです。

  • プロジェクト名
  • 環境(Develop,QAなど)
  • リージョン
  • アクセスキー
  • シークレットアクセスキー

ここで登録するアクセスキー、シークレットアクセスキーは、先に作成したユーザであるGameKitDeverloperUserを作成した際に発行されたものを指定します。

上記の項目を登録した後にsubmitを押します。これが正常に終われば、ようやくGameKitが使える準備が整いました。

ユーザ登録・ログインを使う

ではGameKitを使った実例として、ここではユーザ登録、ログインができるようにしてみます。

本エントリーでは、動作検証程度の使い方にとどめています。しっかりゲームに組み込むためには、もう少しコードを書く必要があるかと思います。

ユーザ登録、ログインができるようにするため、次の処理を行います。

  • サーバ環境の構築
  • フロント側のコード追加

サーバー環境の構築

サーバー構築は、GameKitプラグインから行います。

Identity And Authenticationの項目にある、Login mechanism > Email / Passwordにチェックがはいってることを確認します。これで、ユーザ登録・ログインはEmailとパスワードを指定する形式が利用できます。

その後に、AWS resource actions > Createボタンを押します。これだけです。Createボタンを押した後は、GameKitプラグインがCloudFormationを使ってログインで利用するAPI GatewayやDynamoDBなどの設定が行います。

生成後にDynamoDBのコンソールをみてみると、作成されている様子が確認できます。テーブル名も、gamekit_<環境>_<プロジェクト名>_identitiesといったように、プロジェクト、環境別にテーブルが作成されることがわかります。

フロント側のコード追加

フロント側の構築を行います。フロント側では、レベルにContentを追加することで、ユーザ登録ができるようになります。

まず最初にContentBrowserからAwsGameKit C++ Classes > AwsGameKitEditor > Public Identityへ行き、AwsGameKitIdentityExamplesをレベルへDrag & Dropします。

すると、AwsGameKitIdentityExample1が生成されます。Detailsには、プレイヤー登録、ユーザ認証コードの再送信などさまざまな機能が呼び出せるようになっています。

ユーザ登録してみる

ここでは、ユーザ登録(register Player)を使ってみます。User Name, Email, Passwordに項目を設定した後に Call Register Apiボタンを押します。すると、ユーザ登録処理が実行されます。

ユーザ登録が成功したか、失敗したかは、Return Valueの欄に表示されます。Passwordが単純なものだとエラーとなり、Return Valueにはエラーである旨が表示されます。エラーの詳細についてはOutput Logに表示されます。

ユーザ登録のレコードを確認する

では、登録されているユーザの情報をみてみましょう。先ほど作成されたDynamoDBのレコードをみてみます。先ほどは存在しなかったユーザのレコードが追加されていることが確認できます。

今後の展開

ver 1.0.0なので、これからもっと様々な機能が追加されることが予想されます。今後も注目しつつ、何か新しい機能が追加された場合は、またご紹介したいと思います。