C++ を使用した統合

以下のセクションでは、Unreal Engine のサブシステムを使用して Multiplay Game Server SDK を統合する方法を示します。

Multiplay Game Server SDK では、以下の 3 つのインターフェースを利用できます。

プログラミングサブシステム (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 サブシステムへの参照を取得することでアクセスできます。MultiplayGameServerSubsystemGameInstanceSubsystem の 1 つであり、GameInstance から取得できます。

UWorld* GameWorld = GetWorld();
UGameInstance* GameInstance = GameWorld->GetGameInstance();
UMultiplayGameServerSubsystem* GameServerSubsystem =
GameInstance->GetSubsystem<UMultiplayGameServerSubsystem>();

SubscribeToServerEvents

SubscribeToServerEvents() メソッドを使用して、ゲームサーバーインスタンスと SDK デーモンの間の接続を確立します。

SDK デーモンは、OnAllocateOnDeallocate などのイベントをゲームサーバーに送信します。これらのイベントにサブスクライブすることで、マッチメーカー (または他の割り当てサービス) がゲームセッションに対して 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();