ThirdPersonMP 示例项目本地部署和调试

本指南旨在演示如何以符合 MPS 的方式在本地计算机上运行游戏服务器,以便在将服务器上传到 PlayFab 之前对其进行测试和调试。

目标

  • 测试 ThirdPersonMP+GSDK 项目的本地部署选项。
  • 使用 LocalMultiplayerAgent 运行时验证服务器是否正确执行
  • 验证能否将调试器附加到服务器实例

要求

符号

{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

创建 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 插件 指南。