C++ を使用した統合
Integrate Multiplay Hosting into your Unreal Engine game server using C++.
読み終わるまでの所要時間 5 分最終更新 14日前
以下のセクションでは、Unreal Engine のサブシステムを使用して Multiplay Game Server SDK を統合する方法を示します。 Multiplay Game Server SDK では、以下の 3 つのインターフェースを利用できます。
- Multiplay Server Config Subsystem
- Multiplay Game Server Subsystem
- Multiplay Server Query Handler Subsystem
Multiplay Game Server SDK を依存関係として加える
先に進む前に、MultiplayGameServerSDKMultiplayGameServerSDKアクセスしたいプラグインのヘッダーファイルを自分のクラスに加えます。PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "MultiplayGameServerSDK" });
#include "MultiplayServerConfigSubsystem.h"#include "MultiplayGameServerSubsystem.h"#include "MultiplayServerQueryHandlerSubsystem.h"
Multiplay Server Config Subsystem
このサブシステムを使用して、現在のセッションのサーバー設定を取得します。 このサブシステムはserver.json- サーバー ID。
- 割り当て ID。
- サーバークエリプロトコルのポート。
- セッションの接続ポート。
- ログを書き込むディレクトリ。
server.jsonUMultiplayServerConfigSubsystem へのアクセス方法
最初に、サブシステムへの参照を取得する必要があります。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
OnAllocateGameServerSubsystem->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 コールバックを使用して、割り当て解除イベントにサブスクライブします。割り当て解除イベントへの応答として、土壇場でのクリーンアップやブックキーピングの実行が必要になることもあります。GameServerSubsystem->OnDeallocate.AddDynamic(this, &UMyClass::OnDeallocate);
Multiplay Server Query Handler Subsystem
Multiplay Server Query Handler Subsystem を使用すると、ゲームサーバークエリプロトコルによって監視されるゲームサーバー変数を設定できます。
Multiplay Server Query Handler Subsystem を使用して、関連情報をゲームサーバーの SQP プロトコルに送信します。
Multiplay Server Query Handler Subsystem を使用する前に、以下のコードスニペットに示すようにそれを取得する必要があります。
このサブシステムを取得した後で、ゲームサーバーの接続および切断と、ゲームサーバークエリ値の設定および取得を行うことができます。 すべてのゲームサーバークエリ値の設定は、以下のような set メソッドを使用して行います。 ゲームサーバークエリ値にアクセスするには、以下のようなアクセサーメソッドを使用します。UWorld* GameWorld = GetWorld();UGameInstance* GameInstance = GameWorld->GetGameInstance();UMultiplayServerQueryHandlerSubsystem * ServerQueryHandlerSubsystem = GameInstance->GetSubsystem<UMultiplayServerQueryHandlerSubsystem >();
IncrementCurrentPlayers
IncrementCurrentPlayers() は、プレイヤーがマッチに参加するたびに現在のプレイヤー数をアトミックに増加させる手段を提供します。ServerQueryHandlerSubsystem->IncrementCurrentPlayers();
DecrementCurrentPlayers
DecrementCurrentPlayers() は、プレイヤーがマッチから退出するたびに現在のプレイヤー数をアトミックに減少させる手段を提供します。ServerQueryHandlerSubsystem->DecrementCurrentPlayers();
SetCurrentPlayers
SetCurrentPlayers() メソッドを使用して、ゲームサーバーに接続しているプレイヤーの数を設定します。以下の例は、現在のプレイヤー数を32ServerQueryHandlerSubsystem->SetCurrentPlayers(32);
SetMaxPlayers
SetMaxPlayers() メソッドを使用して、ゲームサーバーに接続できるプレイヤーの最大数を設定します。以下の例は、接続できるプレイヤーの最大数を64ServerQueryHandlerSubsystem->SetMaxPlayers(64);
SetServerName
SetServerName() メソッドを使用して、ゲームサーバー名を設定します。以下の例は、ゲームサーバー名をAwesomeServerServerQueryHandlerSubsystem->SetServerName(TEXT("AwesomeServer"));
SetGameType
SetGameType() メソッドを使用して、ゲームサーバーが実行しているゲームのタイプを設定します。以下の例は、ゲームのタイプをSearchAndDestroyServerQueryHandlerSubsystem->SetGameType(TEXT("SearchAndDestroy"));
SetBuildId
SetBuildId() メソッドを使用して、ゲームサーバーのビルド ID を設定します。以下の例は、ビルド ID をNewBuildId.123.0.1ServerQueryHandlerSubsystem->SetBuildId(TEXT("NewBuildId.123.0.1"));
SetMap
SetMap() メソッドを使用して、ゲームサーバーのマップ名を設定します。以下の例は、ゲームのマップをMAP_TD_DusthillServerQueryHandlerSubsystem->SetMap(TEXT("MAP_TD_Dusthill"));
SetPort
SetPort() メソッドを使用して、ゲームサーバーのポート番号を設定します。以下の例は、ゲームサーバーのポートを8080ServerQueryHandlerSubsystem->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();