使用 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 作为依赖项
继续下一步前,请将MultiplayGameServerSDKMultiplayGameServerSDK将希望访问的插件标头文件包含到您自己的类中:PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "MultiplayGameServerSDK" });
#include "MultiplayServerConfigSubsystem.h"#include "MultiplayGameServerSubsystem.h"#include "MultiplayServerQueryHandlerSubsystem.h"
Multiplay Server Config 子系统
该子系统检索当前会话的服务器配置。 该子系统会通过 MultiplayServerConfig 结构读取server.json- 服务器 ID。
- 分配 ID。
- 服务器查询协议端口。
- 会话的连接端口。
- 要将日志写入的目录。
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 守护程序会将事件传送到游戏服务器,包括 OnAllocate 和 OnDeallocate 事件。订阅这些事件后,游戏服务器会了解您的 Matchmaker(或其他分配服务)在何时将 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 子系统
借助 Multiplay Server Query Handler 子系统,您可以设置游戏服务器变量,这些变量由游戏服务器查询协议进行监控。
使用 Multiplay Server Query Handler 子系统,可将相关信息发送至游戏服务器的 SQP 协议。
使用 Multiplay Server Query Handler 子系统前,您必须检索如下代码片段:
检索子系统之后,您可以连接游戏服务器和断开连接,并设置和获取游戏服务器查询值。 使用以下设置方法配置各种游戏服务器查询值: 使用以下 accessor 方法访问游戏服务器查询值: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() 方法,可连接游戏服务器。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();