本指南旨在演示如何以符合 MPS 的方式在本地计算机上运行游戏服务器,以便在将服务器上传到 PlayFab 之前对其进行测试和调试。
目标
- 测试 ThirdPersonMP+GSDK 项目的本地部署选项。
- 使用 LocalMultiplayerAgent 运行时验证服务器是否正确执行
- 验证能否将调试器附加到服务器实例
要求
- 下载 Visual Studio。
社区版本免费。
- 所需的工作负载:.NET 桌面版开发,以及使用 C++ 进行桌面版开发
- 下载 Unreal Engine 源代码。 请参阅下载 Unreal 引擎源代码(外部)了解操作说明。
- 已安装和配置了 PlayFab Unreal GSDK 的已完成的 Unreal 项目
- 从 Visual Studio 生成的项目中的“开发服务器”配置
- [可选]下载 LocalMultiplayerAgent
- [可选]或者,下载 LocalMultiplayerAgent 源。
- 通过 Visual Studio 从此存储库生成的 LocalMultiplayerAgent 的“调试”或“发布”配置
- 使用 Visual Studio 打开MpsAgent.sln,选择“调试”或“发布”配置,然后生成 LocalMultiplayerAgent。
- [可选]安装适用于 Windows 的 Docker
符号
{depot} 将引用 Git 项目下载位置的完整 Windows 路径。 这些属性可以是你喜欢的任何位置,例如:C:\depot、 S:\depot、Z:\gitrepos 或任何便捷的驱动器和路径。 通常建议(尤其是对于 Unreal){depot} 路径尽可能短。 对于作者,{depot} 解析为:M:\depot\GSDK
。 例如,使用上述要求列表时,可能会有以下部分或全部内容:
- {depot}/ThirdPersonMP
- {depot}/MpsAgent
- [可选]{depot}/gsdk [这包含之前安装到 ThirdPersonMP 的 PlayFab Unreal GSDK 插件]
- [可选]{depot}/UnrealMarketplacePlugin [这包含 PlayFab Unreal Marketplace 插件,本指南无需该插件,但大多数 PlayFab 功能都需要]
不需要将所有这些内容都位于同一位置,但这样做可能很有用,对于组织来说,本指南鼓励这样做。
说明
本地执行,无容器
首先,需要配置 LocalMultiplayerAgent 以执行服务器项目。 第一次迭代直接在本地电脑上运行该进程,无任何隔离。
在资源管理器中,查找并打开文件:{depot}\MpsAgent\LocalMultiplayerAgent\MultiplayerSettings.json
。 此文件的缩写版本(包含本指南的重要部分)如下所示[请注意 json 中路径的转义 \s - 这是 json 文件,因此需要将所有 \'s 转义为 \\]:
{
"RunContainer": false,
"OutputFolder": "<Local absolute path that will be used to store the required output artifacts>",
...
"AssetDetails": [
{
"MountPath": "C:\\Assets",
"LocalFilePath": "{PATH-TO-ZIP}"
}
],
...
"PortMappingsList": [
[
{
"NodePort": 30000,
"GamePort": {
"Name": "gameport",
"Number": 8888,
"Protocol": "UDP"
}
}
]
],
"ProcessStartParameters": {
"StartGameCommand": "{PATH-TO-EXE} -log"
},
"ContainerStartParameters": {
"StartGameCommand": "C:\\Assets\\ThirdPersonMPServer.exe -log",
...
}
}
出于本指南的目的,...
上面遮盖的 json 文件的各个部分仅使用项目默认值。 重要字段的用途和值如下所示:
- RunContainer:对于本指南,这始终为 false。 将此设置为 true 需要 Docker。
- 如果为 true,会忽略 ProcessStartParameters/StartGameCommand,并改用 ContainerStartParameters/StartGameCommand
- 如果为 true,所有内容都在 docker 容器(而不是本地计算机上下文)中生成并运行
- 本指南涵盖 RunContainer 为 false 时的场景,以便我们可以更轻松地调试服务器进程
- 将此设置为 true 需要交付服务器版本和其他Docker for Windows
- OutputFolder:
"<Local absolute path that will be used to store the required output artifacts>"
- 必须完全定义此位置,并且此位置必须存在有效目录。
- AssetDetails/LocalFilePath: {PATH-TO-ZIP}
- 必须完全定义此位置,并且此位置必须存在有效的 zip 文件
- 此 zip 文件应包含完全构造的“交付服务器”版本
- PortMappingsList:
- 这与在 Game Manager 中定义端口的 LocalMultiplayerAgent 等效
- GSDK 插件是硬编码插件,用于查找名为:gameport 的端口
- GSDK 插件SetDefaultServerHostPort方法将在内部替代内部 Unreal 服务器托管端口以匹配此端口
- GSDK 插件将仅使用名为gameport的端口,在使用 LocalMultiplayerAgent 时,该端口在PortMappingsList中配置。
- 此 json 允许从 MPS 在本地测试驱动此端口号,并确保 GSDK 插件将正确接收它
- ContainerStartParameters/StartGameCommand:虽然 RunContainer 为 false,但未使用。
- 当 RunContainer==true 时,它会取代 ProcessStartParameters/StartGameCommand
- 此路径是 docker 容器中的内部路径,将是 AssetDetails/MountPath 的总和,以及 AssetDetails/LocalFilePath 定义的 zip 文件中的内部 exe 路径
- 对于此示例,这可能是:
C:\\Assets\\ThirdPersonMPServer.exe -log
- ProcessStartParameters/StartGameCommand:此命令将有效地成为 exe 的路径,以及用于启动游戏服务器的任何命令行参数
- -log 是 Unreal 命令,用于指示游戏服务器保存执行日志
- {PATH-TO-EXE} 可以是以下两个选项之一:
- 游戏服务器(甚至是开发游戏服务器)的任何 exe 绝对路径,以及服务器的任何命令行参数
- 此选项会忽略 zip 文件的内容,改为在任何位置执行任意 exe
- 这是本地调试选项,仅适用于本地计算机调试开发版本:它无法帮助验证 zip 文件是否已准备好上传到 MPS
- 在测试适合附加 VS 调试器的开发服务器时,应使用此选项
- 对于此示例,这可能是:
{depot}\\ThirdPersonMP\\Binaries\\Win64\\ThirdPersonMPServer.exe -log
- 对于作者,这是:
M:\\depot\\GSDK\\ThirdPersonMPGSDK\\Binaries\\Win64\\ThirdPersonMPServer.exe -log
- 相对路径(应指示 zip 文件中的相对路径)以运行服务器
- 这是标准工作流,用于镜像它在 MPS 云实例上的工作方式
- 测试交付服务器时应使用此选项,它可帮助验证 zip 是否已准备好上传到 MPS
- 对于此示例,这可能是:
ThirdPersonMPServer.exe -log
- 游戏服务器(甚至是开发游戏服务器)的任何 exe 绝对路径,以及服务器的任何命令行参数
创建 zip 文件并将所有这些行都设置为适当的值后,可以重新生成 LocalMultiplayerAgent,并准备调试服务器。
调试服务器
可以使用“启动新实例”命令(有时绑定到 F5)从 Visual Studio 运行 LocalMultiplayerAgent,也可以导航到{depot}\LocalMultiplayerAgent\bin\{configuration}\netcoreapp3.1
并双击“LocalMultiplayerAgent.exe”。 还可以从 cmd 窗口中运行此项,从而观察或捕获调试日志信息。
运行 LocalMultiplayerAgent.exe 应启动游戏服务器。 通常需要为此打开任务管理器。 可以在任务管理器的“详细信息”选项卡中找到游戏服务器进程 ID。
看到 ThirdPersonMPServer 进程在任务管理器中运行后,可以返回到 Visual Studio,选择“调试”下拉列表 ->“附加到进程”。 在弹出窗口中,可以搜索进程名称:ThirdPersonMPServer,然后选择从任务管理器识别的正确进程 ID。
此时,应该能够对游戏服务器执行典型调试。
注意:Unreal 提供了多种生成配置和多种生成服务器的方法。 为了获得最佳结果,请使用直接从 Visual Studio 生成的“开发服务器”配置和输出。 开发编辑器的交付版本或版本可能更适用于其他情况,但直接从 Visual Studio 生成的“开发服务器”配置将更易于在 Visual Studio 中进行附加和调试。
故障排除
任务管理器中 ThirdPersonMPServer 的许多实例
如果列出了多个实例(通常为 3 个或更多),可能需要使用任务管理器强制关闭之前尝试延迟的实例。
LocalMultiplayerAgent 启动 ThirdPersonMPServer 的两个实例
如果 LocalMultiplayerAgent 启动多个实例,请查找内存使用率相对较高的进程 ID。 游戏服务器的一些配置会生成两个可执行文件,它们作为一对运行。 需要附加到内存使用率更高的进程 ID。
后续步骤
现在可以将服务器部署到云。
否则,可以返回到主 Unreal GSDK 插件 指南。