AccelByte Unity SDK を使用してゲームサーバーに AMS を統合する - ゲームサーバー統合 - (Unity モジュール)
注釈:本資料はAI技術を用いて翻訳されています。
AMS を使用したゲームサーバーのフロー
始める前に、AccelByte Multiplayer Servers (AMS) によってゲームサーバーがどのように管理されるかを理解しましょう。以下の状態図は、サーバーが経過する状態と、それぞれの状態間の遷移方法を示しています。
ゲームサーバーが起動すると、WebSocket 経由で AMS に接続します。接続が確立されると、ゲームサーバーはサーバーの準備ができたことを示すメッセージを送信します。準備が完了すると、ゲームサーバーはバックエンドサービスによって要求され、ゲームクライアントのゲームセッションを提供できるようになります。ゲームプレイが終了したら、ゲームサーバーはシャットダウンし、AMS WebSocket から切断する必要があります。
AMS は、未使用のサーバーを削除するために、ゲームサーバーに drain イベントを送信することもできます。このイベントが発生した場合、ゲームサーバーがゲームセッションを提供していない場合(例:サーバーにプレイヤーがいない場合)、不要なコストを避けるためにゲームサーバーをシャットダウンする必要があります。
ラッパーを展開する
このチュートリアルでは、AccelByte Unity SDK を使用して、AccelByte Multiplayer Servers (AMS) をゲームサーバーと統合する方法を示します。Byte Wars には、AMSModuleWrapper_Starter クラスで定義された完成したラッパーがあります。このチュートリアルでは、そのラッパーのスターターバージョンを使用して、機能をゼロから統合します。
スターターパックの内容
このチュートリアルに従うには、AMSModuleWrapper_Starter というスターターラッパークラスを使用します。このラッパーは以下のファイルで定義されています。
- CS ファイル:
Assets/Resources/Modules/AMSModule/Scripts/AMSModuleWrapper_Starter.cs
ゲームサーバーに AMS を統合する
-
まず、Unity Editor でプロジェクトを開きます。
Assets/Resources/Modules/AMSModuleフォルダに移動し、AMSModuleAssetConfig.assetを開きます。次に、Is ActiveチェックボックスとIs Starter Activeチェックボックスにチェックを入れて、スターターモードでモジュールを有効にします。この設定により、ゲームサーバーの起動時にAMSModuleWrapper_Starterラッパーファイルが有効になります。 -
次に、
AMSModuleWrapper_Starterクラスを開き、以下の AMS インターフェース変数を宣言します。private ServerAMS ams; -
ゲームサーバーの起動時にゲームサーバーを AMS に接続するための新しい関数を以下に作成します。以下のコードは、後で作成するコールバック関数に AMS イベントをバインドします。
private void OnEnable()
{
BytewarsLogger.Log("AMS Module wrapper initialized.");
// Get AMS interface from SDK with auto create and auto connect to AMS WebSocket enabled.
ams = AccelByteSDK.GetServerRegistry().GetAMS(autoCreate: true, autoConnect: true);
if (ams == null)
{
BytewarsLogger.LogWarning("AMS interface is null. You might run the instance in Unity Editor. Try to package the game server as executable.");
return;
}
ams.OnOpen += OnConnected;
ams.Disconnected += OnDisconnected;
ams.OnDrainReceived += OnDrainReceived;
// On-server deregister (e.g. game over), disconnect from AMS.
GameManager.Instance.OnDeregisterServer += Disconnect;
} -
次に、ゲームサーバーが非初期化されたときに AMS イベントのバインドを解除するための新しい関数を以下に作成します。
private void OnDisable()
{
BytewarsLogger.Log("AMS Module wrapper deinitialized.");
if (ams == null)
{
BytewarsLogger.LogWarning("AMS interface is null. You might run the instance in Unity Editor. Try to package the game server as executable.");
return;
}
// Unbind events.
ams.OnOpen -= OnConnected;
ams.Disconnected -= OnDisconnected;
ams.OnDrainReceived -= OnDrainReceived;
GameManager.Instance.OnDeregisterServer -= Disconnect;
} -
ゲームサーバーがゲームセッションを提供する準備ができたことを示すメッセージを AMS WebSocket に送信するための新しい関数を作成します。この関数は、ゲームサーバーが適切にセットアップされたとき(例:正しいシーンのロード、正しいゲームプレイ設定のロード)に呼び出す必要があります。
private void SendServerReady()
{
if (!ams.IsConnected)
{
BytewarsLogger.LogWarning("Cannot set server ready. The AMS websocket connection is not established.");
return;
}
BytewarsLogger.Log("Send server ready message to AMS.");
ams.SendReadyMessage();
} -
次に、AMS WebSocket 接続が確立されたときに処理するための新しいコールバック関数を作成します。この関数は
SendServerReady()を呼び出してサーバーを準備完了としてマークします。ただし、これは Byte Wars の例にすぎません。ゲームサーバーがプレイヤーを迎える前に他の何かをセットアップする必要がある場合(例:正しいシーンのロード、正しいゲームプレイ設定のロード)、それらのセットアップが完了した後にSendServerReady()関数を呼び出す必要があります。private void OnConnected()
{
BytewarsLogger.Log("Success to connect to AMS websocket.");
/* It is not required to set the server as ready immediately after the AMS websocket connection is established.
* If the server needs to perform setup tasks before welcoming the player, the server ready message should be sent afterward.
* Since Byte Wars does not require such setup, the server ready message is sent immediately here. */
SendServerReady();
} -
ゲームサーバーを AMS WebSocket から切断するための新しい関数を作成します。
private void Disconnect()
{
if (!ams.IsConnected)
{
BytewarsLogger.LogWarning("Cannot disconnect AMS websocket. The AMS websocket connection is not established.");
return;
}
BytewarsLogger.Log("Disconnecting from AMS websocket.");
ams.Disconnect();
} -
次に、ゲームサーバーが AMS WebSocket から切断されたときに処理するための新しいコールバック関数を作成します。以下のコードでは、切断が正常な場合、ゲームサーバーはシャットダウンします。このイベントは、ニーズに合わせて好きなように処理することもできます。
private void OnDisconnected(WsCloseCode wsCloseCode)
{
BytewarsLogger.Log($"Disconnected from AMS websocket. Ws Code: {wsCloseCode}");
if (wsCloseCode == WsCloseCode.Normal)
{
#if UNITY_EDITOR
UnityEditor.EditorApplication.ExitPlaymode();
#else
Application.Quit();
#endif
}
} -
最後に、AMS drain イベントを受信したときに処理するための新しいコールバック関数を作成します。この関数では、ゲームサーバーが現在ゲームセッションを提供していない場合、AMS WebSocket から切断してシャットダウンします。それ以外の場合、drain イベントは無視されます。これは Byte Wars の例にすぎず、ニーズに合わせて drain イベントを好きなように処理できます。
private void OnDrainReceived()
{
BytewarsLogger.Log("Drain event received.");
/* When a drain event occurs, the server may perform some clean-up tasks.
* Drain behavior on Byte Wars:
* If the server is not serving any game session, then disconnect the server from AMS and shut it down.
* Otherwise, keep it running as normal. */
if (GameManager.Instance.InGameMode == InGameMode.None && GameManager.Instance.ConnectedPlayerStates.Count <= 0)
{
BytewarsLogger.Log("There is no game is in progress. Handle drain event to shut down the server.");
Disconnect();
return;
}
BytewarsLogger.Log("The game is in progress. Ignore drain event.");
}
リソース
-
このチュートリアルセクションで使用されるファイルは、Unity Byte Wars GitHub リポジトリで入手できます。