文档

支持

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 分钟最后更新于 2 个月前

以下部分展示如何使用 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 回调,可订阅取消分配事件。您可能想要执行最后时刻清理或记录操作,以响应取消分配事件。
注意
最后时刻清理操作可能包括通过处理对象和调用 RequestExit 来退出应用程序,从而收集服务器中的遥测数据并开始关闭流程。
GameServerSubsystem->OnDeallocate.AddDynamic(this, &UMyClass::OnDeallocate);

Multiplay Server Query Handler 子系统

借助 Multiplay Server Query Handler 子系统,您可以设置游戏服务器变量,这些变量由游戏服务器查询协议进行监控。
注意
Multiplay Game Server SDK 拥有 Unity 服务器查询协议的完整实现,因此游戏服务器只需填充这些变量即可。请参阅服务器查询协议,了解更多信息。
使用 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();