この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
GameLiftでは、主要なゲームエンジン (Amazon Lumberyard、Unreal Engine、Unity など) で作成したビルドをGame serversとして起動させることができます。 この記事では主要なゲームエンジンの中でもよく利用されているUnityでビルドを作成し、そのビルドをGameLiftで起動させる方法を紹介したいと思います。
Game serversとGameLift serviceの通信について
GameLiftの全体アーキテクチャのおさらいです。GameLiftにはゲームエンジンで作成したビルドを起動させるためのGame serversと、Game serversを管理するためのGameLift serviceが存在します。
Game serversとGameLift service間では、各フェーズに毎にいくつかの通信が発生しており、 この通信を元にゲームセッション、ユーザーセッションの管理や、Game serversのスケールアウト/インが行われています。
ビルド作成
上記の通信を簡易に実現させるため、AWSからServer SDKが提供されています。 Unreal Engine、Unityについては導入のための簡単な手順も用意されています。
今回はこの手順を元に、Unityでビルドを作成し、GameLiftで起動させてみようと思います。
環境
ビルドを作成するためには以下が必要です。必要に応じてインストールしてください。
- 以下のIDEのいずれか
- Visual Studio 2012 以上
- Xamarin Studio 6.1 以上
- Mono develop 6.1 以上
- .Net framework 3.5
- Unity
この記事ではVisual Studio 2017 を使った手順を紹介します。
Server SDKのダウンロード、ライブラリ構築
まずは、Server SDKをダウンロードし、
Visual Studioにてダウンロードしたソリューションファイル(GameLiftServerSDKNet35.sln)を開きます。
次にNuGet パッケージを復元し、ソリューションを構築します。
プロジェクトをビルドします。
ビルドが完了すると対象のディレクトリに以下のdllが生成されます。
- EngineIoClientDotNet.dll
- GameLiftServerSDKNet35.dll
- log4net.dll
- Newtonsoft.Json.dll
- protobuf-net.dll
- SocketIoClientDotNet.dll
- System.Threading.Tasks.NET35.dll
- WebSocket4Net.dll
UnityプロジェクトへのSDK追加
Unityを起動し、新規にプロジェクトを作成します。
次にAPI の互換性の設定を行います。 Unity エディタで、[File]、[Build Settings]、[Player Settings] の順に選択し、 API の互換性レベルを [.Net 2.0] に設定します。
UnityにServer SDKを追加します。 Unity エディタで、Assets/Plugins ディレクトリを作成し、先ほど作成したdllを配置します。
Game serverの初期化コード追加
Hierarchyに空のGameObjectを作成し、そのオブジェクトにC#のスクリプトを追加します。
using UnityEngine;
using Aws.GameLift.Server;
using System.Collections.Generic;
public class GameLiftServerExampleBehavior : MonoBehaviour
{
//This is an example of a simple integration with GameLift server SDK that makes game server processes go active on Amazon GameLift
public void Start()
{
var listeningPort = 7777;
//InitSDK establishes a local connection with Amazon GameLift's agent to enable further communication.
var initSDKOutcome = GameLiftServerAPI.InitSDK();
if (initSDKOutcome.Success)
{
ProcessParameters processParameters = new ProcessParameters(
(gameSession) => {
//When a game session is created, GameLift sends an activation request to the game server and passes along the game session object containing game properties and other settings.
//Here is where a game server should take action based on the game session object.
//Once the game server is ready to receive incoming player connections, it should invoke GameLiftServerAPI.ActivateGameSession()
GameLiftServerAPI.ActivateGameSession();
},
() => {
//OnProcessTerminate callback. GameLift invokes this callback before shutting down an instance hosting this game server.
//It gives this game server a chance to save its state, communicate with services, etc., before being shut down.
//In this case, we simply tell GameLift we are indeed going to shut down.
GameLiftServerAPI.ProcessEnding();
},
() => {
//This is the HealthCheck callback.
//GameLift invokes this callback every 60 seconds or so.
//Here, a game server might want to check the health of dependencies and such.
//Simply return true if healthy, false otherwise.
//The game server has 60 seconds to respond with its health status. GameLift will default to 'false' if the game server doesn't respond in time.
//In this case, we're always healthy!
return true;
},
listeningPort, //This game server tells GameLift that it will listen on port 7777 for incoming player connections.
new LogParameters(new List<string>()
{
//Here, the game server tells GameLift what set of files to upload when the game session ends.
//GameLift uploads everything specified here for the developers to fetch later.
"/local/game/logs/myserver.log"
}));
//Calling ProcessReady tells GameLift this game server is ready to receive incoming game sessions!
var processReadyOutcome = GameLiftServerAPI.ProcessReady(processParameters);
if (processReadyOutcome.Success)
{
print("ProcessReady success.");
}
else
{
print("ProcessReady failure : " + processReadyOutcome.Error.ToString());
}
}
else
{
print("InitSDK failure : " + initSDKOutcome.Error.ToString());
}
}
void OnApplicationQuit()
{
//Make sure to call GameLiftServerAPI.Destroy() when the application quits. This resets the local connection with GameLift's agent.
GameLiftServerAPI.Destroy();
}
}
ビルド作成
Build Settingを起動後、対象のシーンを追加しビルドを作成します。
Game server起動
アップロード
AWS CLIを使ってビルドをGameLiftにアップロードします。
#Windowsの場合
aws gamelift upload-build --name <your build name> --build-version <your build number> --build-root <local build path> --operating-system WINDOWS_2012 --region ap-northeast-1
アップロードが完了すると、コンソールよりビルドが確認できます。
フリート作成
長くなりましたが、最後にフリートを作成します。
フリートの詳細には、先ほどアップロードしたビルドを選択。
プロセス管理には、ビルドの起動パスと起動パラメータを指定します。Unityで作成したWindows用のビルドをFleetとして起動させる場合は、起動パラメータとして-batchmode
を指定する必要があります。
その他設定値については、一旦デフォルトとします。
ステータス確認
フリートのステータスがアクティブ
となっていればOKです。
フリートのステータスの遷移も確認することができます。
まとめ
簡単にではありますが、Unityで作成したビルドをGameLift上で起動させることができましたー!!やったね