C++ を使用した統合
以下のセクションでは、Unreal Engine のサブシステムを使用して Multiplay Game Server SDK を統合する方法を示します。
Multiplay Game Server SDK では、以下の 3 つのインターフェースを利用できます。
- Multiplay Server Config Subsystem
- Multiplay Game Server Subsystem
- Multiplay Server Query Handler Subsystem
プログラミングサブシステム (Unreal Engine) を参照してください。
Multiplay Game Server SDK を依存関係として加える
先に進む前に、MultiplayGameServerSDK
をモジュールのパブリック依存関係として追加し、プラグインのヘッダーファイルをクラスに加えます。
MultiplayGameServerSDK
をモジュールの依存関係として Unreal プロジェクトのビルドファイルに追加します。
PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "MultiplayGameServerSDK" });
アクセスしたいプラグインのヘッダーファイルを自分のクラスに加えます。
#include "MultiplayServerConfigSubsystem.h"
#include "MultiplayGameServerSubsystem.h"
#include "MultiplayServerQueryHandlerSubsystem.h"
Multiplay Server Config Subsystem
このサブシステムを使用して、現在のセッションのサーバー設定を取得します。
このサブシステムは server.json
ファイルを読み取り、その値を MultiplayServerConfig 構造体を介して公開します。
MultiplayServerConfig には以下の値があります。
- サーバー ID。
- 割り当て ID。
- サーバークエリプロトコルのポート。
- セッションの接続ポート。
- ログを書き込むディレクトリ。
MultiplayServerConfigSubsystem は、サブシステムの初期化時に server.json
ファイルを自動的に読み取ります。
UMultiplayServerConfigSubsystem へのアクセス方法
最初に、サブシステムへの参照を取得する必要があります。MultiplayServerConfigSubsystem は、GameInstanceSubsystem の 1 つです。GameInstance から取得できます。
UWorld* GameWorld = GetWorld();
UGameInstance* GameInstance = GameWorld->GetGameInstance();
UMultiplayServerConfigSubsystem* ServerConfigSubsystem = GameInstance->GetSubsystem<UMultiplayServerConfigSubsystem>();
GetServerConfig
サブシステムへの参照を取得したら、MultiplayServerConfigSubsystem::GetServerConfig() を使用して MultiplayServerConfig を取得します。
例を次に示します。
const FMultiplayServerConfig& ServerConfig = ServerConfigSubsystem->GetServerConfig();
UE_LOG(YourLogCategory, Log, TEXT("Server ID: %lld Allocation ID: %s Server Query Port: %u Port: %u Server Log Directory: %s"), ServerConfig.ServerId, *ServerConfig.AllocationId, ServerConfig.QueryPort, ServerConfig.Port, *ServerConfig.ServerLogDirectory)
Multiplay Game Server Subsystem
Multiplay Game Server Subsystem を使用すると、ゲームサーバーが割り当て済みになったときやゲームサーバーがプレイヤーを受け入れる準備ができたときなどのゲームサーバーイベントにサブスクライブ (および応答) できます。ゲームサーバーのライフサイクル と サーバーの準備状況 を参照してください。
Multiplay Game Server Subsystem には、MultiplayGameServerSubsystem サブシステムへの参照を取得することでアクセスできます。MultiplayGameServerSubsystem は GameInstanceSubsystem の 1 つであり、GameInstance から取得できます。
UWorld* GameWorld = GetWorld();
UGameInstance* GameInstance = GameWorld->GetGameInstance();
UMultiplayGameServerSubsystem* GameServerSubsystem =
GameInstance->GetSubsystem<UMultiplayGameServerSubsystem>();
SubscribeToServerEvents
SubscribeToServerEvents() メソッドを使用して、ゲームサーバーインスタンスと SDK デーモンの間の接続を確立します。
SDK デーモンは、OnAllocate や OnDeallocate などのイベントをゲームサーバーに送信します。これらのイベントにサブスクライブすることで、マッチメーカー (または他の割り当てサービス) がゲームセッションに対して Multiplay の割り当ておよび割り当て解除を行ったときにゲームサーバーに通知されます。
GameServerSubsystem->SubscribeToServerEvents();
OnAllocate
OnAllocate
マルチキャストデリゲートは、ゲームサーバーが割り当てられたときにゲームサーバーに通知されるようにします。インスタンスが割り当てられたときに通知されるようにするには、ゲームサーバーインスタンスが OnAllocate コールバックにサブスクライブする必要があります。
OnAllocate コールバックを使用して、ゲームサーバーが割り当て済みになったときに必要な設定ロジックを実行します。
GameServerSubsystem->OnAllocate.AddDynamic(this, &UMyClass::OnAllocate);
ReadyServerForPlayers
ReadyServerForPlayers() メソッドを使用して、ゲームサーバーがプレイヤーを受け入れる準備ができたことを Multiplay に通知します。
void UMyClass::OnAllocate()
{
// Perform setup logic.
FReadyServerSuccessDelegate OnSuccess;
FReadyServerFailureDelegate OnFailure;
OnSuccess.BindDynamic(this, &UMyClass::OnReadyServerSuccess);
OnFailure.BindDynamic(this, &UMyClass::OnReadyServerFailure);
GameServerSubsystem->ReadyServerForPlayers(OnSuccess, OnFailure);
}
UnreadyServer
UnreadyServer() メソッドを使用して、ゲームサーバーがプレイヤーを受け入れる準備ができなくなったことを Multiplay に通知します。
UnreadyServer() を使用するシナリオとしては、以下のような場合が考えられます。
ゲームマッチがほぼ完了した
ゲームマッチが完了した
ゲームサーバーがいっぱいになった
FUnreadyServerSuccessDelegate OnSuccess; FUnreadyServerFailureDelegate OnFailure; OnSuccess.BindDynamic(this, &UMyClass::OnUnreadyServerSuccess); OnFailure.BindDynamic(this, &UMyClass::OnUnreadyServerFailure); GameServerSubsystem->UnreadyServer(OnSuccess, OnFailure);
OnDeallocate
OnDeallocate コールバックを使用して、割り当て解除イベントにサブスクライブします。割り当て解除イベントへの応答として、土壇場でのクリーンアップやブックキーピングの実行が必要になることもあります。
土壇場でのクリーンアップには、サーバーからテレメトリデータを収集し、オブジェクトの破棄と RequestExit の呼び出しによるアプリケーションの終了によってシャットダウンプロセスを開始する場合などがあります。
GameServerSubsystem->OnDeallocate.AddDynamic(this, &UMyClass::OnDeallocate);
Multiplay Server Query Handler Subsystem
Multiplay Server Query Handler Subsystem を使用すると、ゲームサーバークエリプロトコルによって監視されるゲームサーバー変数を設定できます。
Multiplay Game Server SDK は Unity のサーバークエリプロトコルの完全な実装を備えているため、ゲームサーバーは変数を入力するだけで済みます。詳細については、サーバークエリプロトコル を参照してください。
Multiplay Server Query Handler Subsystem を使用して、関連情報をゲームサーバーの SQP プロトコルに送信します。
Multiplay Server Query Handler Subsystem を使用する前に、以下のコードスニペットに示すようにそれを取得する必要があります。
UWorld* GameWorld = GetWorld();
UGameInstance* GameInstance = GameWorld->GetGameInstance();
UMultiplayServerQueryHandlerSubsystem * ServerQueryHandlerSubsystem = GameInstance->GetSubsystem<UMultiplayServerQueryHandlerSubsystem >();
このサブシステムを取得した後で、ゲームサーバーの接続および切断と、ゲームサーバークエリ値の設定および取得を行うことができます。
すべてのゲームサーバークエリ値の設定は、以下のような set メソッドを使用して行います。
ゲームサーバークエリ値にアクセスするには、以下のようなアクセサーメソッドを使用します。
IncrementCurrentPlayers
IncrementCurrentPlayers() は、プレイヤーがマッチに参加するたびに現在のプレイヤー数をアトミックに増加させる手段を提供します。
ServerQueryHandlerSubsystem->IncrementCurrentPlayers();
DecrementCurrentPlayers
DecrementCurrentPlayers() は、プレイヤーがマッチから退出するたびに現在のプレイヤー数をアトミックに減少させる手段を提供します。
ServerQueryHandlerSubsystem->DecrementCurrentPlayers();
SetCurrentPlayers
SetCurrentPlayers() メソッドを使用して、ゲームサーバーに接続しているプレイヤーの数を設定します。以下の例は、現在のプレイヤー数を 32
に設定する方法を示しています。
ServerQueryHandlerSubsystem->SetCurrentPlayers(32);
SetMaxPlayers
SetMaxPlayers() メソッドを使用して、ゲームサーバーに接続できるプレイヤーの最大数を設定します。以下の例は、接続できるプレイヤーの最大数を 64
に設定する方法を示しています。
ServerQueryHandlerSubsystem->SetMaxPlayers(64);
SetServerName
SetServerName() メソッドを使用して、ゲームサーバー名を設定します。以下の例は、ゲームサーバー名を AwesomeServer
に設定する方法を示しています。
ServerQueryHandlerSubsystem->SetServerName(TEXT("AwesomeServer"));
SetGameType
SetGameType() メソッドを使用して、ゲームサーバーが実行しているゲームのタイプを設定します。以下の例は、ゲームのタイプを SearchAndDestroy
に設定する方法を示しています。
ServerQueryHandlerSubsystem->SetGameType(TEXT("SearchAndDestroy"));
SetBuildId
SetBuildId() メソッドを使用して、ゲームサーバーのビルド ID を設定します。以下の例は、ビルド ID を NewBuildId.123.0.1
に設定する方法を示しています。
ServerQueryHandlerSubsystem->SetBuildId(TEXT("NewBuildId.123.0.1"));
SetMap
SetMap() メソッドを使用して、ゲームサーバーのマップ名を設定します。以下の例は、ゲームのマップを MAP_TD_Dusthill
に設定する方法を示しています。
ServerQueryHandlerSubsystem->SetMap(TEXT("MAP_TD_Dusthill"));
SetPort
SetPort() メソッドを使用して、ゲームサーバーのポート番号を設定します。以下の例は、ゲームサーバーのポートを 8080
に設定する方法を示しています。
ServerQueryHandlerSubsystem->SetPort(8080);
これは、ゲームクライアントがゲームサーバーへの接続元として使用できるポート番号です。クエリポート番号とは別です。
これらの値は、ゲームの継続時間全体を通じて継続的に更新するのが最良です。これらの値をできる限り最新の状態に維持することにより、Multiplay がサーバーの実行中に確実にデータを収集および表示できるようになります。すべての値を設定した後で、Connect() メソッドの呼び出しを行うことができます。
Connect
Connect() メソッドを使用して、ゲームサーバーに接続します。
ServerQueryHandlerSubsystem->Connect();
GetCurrentPlayers
GetCurrentPlayers() メソッドを使用して、ゲームサーバーに接続しているプレイヤーの数を取得します。
int32 CurrentPlayers = ServerQueryHandlerSubsystem->GetCurrentPlayers();
GetMaxPlayers
GetMaxPlayers() メソッドを使用して、ゲームサーバーに参加できるプレイヤーの最大数を取得します。
int32 MaxPlayers = ServerQueryHandlerSubsystem->GetMaxPlayers();
GetServerName
GetServerName() メソッドを使用して、ゲームサーバー名を取得します。
FString ServerName = ServerQueryHandlerSubsystem->GetServerName();
GetGameType
GetGameType() メソッドを使用して、ゲームサーバーのタイプを取得します。
FString GameType = ServerQueryHandlerSubsystem->GetGameType();
GetBuildId
GetBuildId() メソッドを使用して、ゲームサーバーが実行しているビルドの ID を取得します。
FString BuildId = ServerQueryHandlerSubsystem->GetBuildId();
GetMap
GetMap() メソッドを使用して、ゲームサーバーのアクティブなマップを取得します。
FString Map = ServerQueryHandlerSubsystem->GetMap();
GetPort
GetPort() メソッドを使用して、ゲームサーバーのポート番号を取得します。
これは、ゲームクライアントがゲームサーバーへの接続元として使用できるポート番号です。クエリポート番号とは別です。
int32 Port = ServerQueryHandlerSubsystem->GetPort();
切断
Disconnect() メソッドを使用して、ゲームサーバーの更新から切断します。サーバーから切断した後は、ゲームサーバーに関する更新 (割り当てイベントや割り当て解除イベントなど) を受信できなくなります。
ServerQueryHandlerSubsystem->Disconnect();