文档

支持

Multiplay Hosting for the Unreal Engine

Multiplay Hosting overview

Multiplay Hosting for the Unreal Engine

使用 C++ 集成

Integrate Multiplay Hosting into your Unreal Engine game server using C++.
阅读时间8 分钟最后更新于 4 天前

以下部分展示如何使用 Unreal Engine 子系统与 Multiplay Game Server SDK 集成。 Multiplay Game Server SDK 提供三种界面: 请参阅编程子系统 (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 子系统

该子系统检索当前会话的服务器配置。 该子系统会通过 MultiplayServerConfig 结构读取
server.json
文件并公开它的值。
MultiplayServerConfig 具备以下值:
  • 服务器 ID。
  • 分配 ID。
  • 服务器查询协议端口。
  • 会话的连接端口。
  • 要将日志写入的目录。
MultiplayServerConfigSubsystem 会在子系统初始化时自动读取
server.json
文件。

如何访问 UMultiplayServerConfigSubsystem

首先,您必须获得子系统的引用,MultiplayServerConfigSubsystem 属于 GameInstanceSubsystem。您可以从 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 子系统

Multiplay Game Server 子系统允许您订阅(和响应)游戏服务器事件,如游戏服务器得到分配时和游戏服务器为玩家准备就绪时。请参阅游戏服务器生命周期服务器就绪 您可以通过获取 MultiplayGameServerSubsystem 子系统的引用来访问 Multiplay Game Server 子系统。MultiplayGameServerSubsystem 属于 GameInstanceSubsystem,可在 GameInstance 中检索。
UWorld* GameWorld = GetWorld();UGameInstance* GameInstance = GameWorld->GetGameInstance();UMultiplayGameServerSubsystem* GameServerSubsystem =GameInstance->GetSubsystem<UMultiplayGameServerSubsystem>();

SubscribeToServerEvents

使用 SubscribeToServerEvents() 方法,可在游戏服务器实例和 SDK 守护程序之间建立联系。 SDK 守护程序会将事件传送到游戏服务器,包括 OnAllocateOnDeallocate 事件。订阅这些事件后,游戏服务器会了解您的 Matchmaker(或其他分配服务)在何时将 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 回调,可订阅取消分配事件。您可能想要执行最后时刻清理或记录操作,以响应取消分配事件。
GameServerSubsystem->OnDeallocate.AddDynamic(this, &UMyClass::OnDeallocate);

Multiplay Server Query Handler 子系统

借助 Multiplay Server Query Handler 子系统,您可以设置游戏服务器变量,这些变量由游戏服务器查询协议进行监控。 使用 Multiplay Server Query Handler 子系统,可将相关信息发送至游戏服务器的 SQP 协议。 使用 Multiplay Server Query Handler 子系统前,您必须检索如下代码片段:
UWorld* GameWorld = GetWorld();UGameInstance* GameInstance = GameWorld->GetGameInstance();UMultiplayServerQueryHandlerSubsystem * ServerQueryHandlerSubsystem = GameInstance->GetSubsystem<UMultiplayServerQueryHandlerSubsystem >();
检索子系统之后,您可以连接游戏服务器和断开连接,并设置和获取游戏服务器查询值。 使用以下设置方法配置各种游戏服务器查询值: 使用以下 accessor 方法访问游戏服务器查询值:

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() 方法,可连接游戏服务器。
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();