For the complete documentation index, see llms.txt. This page is also available as Markdown.

Unreal Engine - 入门指南

通过实践学习,并在 Edgegap 上部署你的第一个专用服务器。本指南结束时,你将免费使用 Edgegap 部署一个专用服务器。

使用 Docker Desktop 构建是入门最快、最简单且最可靠的方法。

✔️ 准备工作

在开始之前,请确保 在 Edgegap 创建一个免费账户 (无需信用卡)。

在你的开发机器上配置一些基本设置:

安装 Docker Desktop 和 Docker Edgegap 扩展
安装 Edgegap Quickstart Docker 扩展
  • 从 Docker Desktop / Extensions / Browse 安装,或者 使用链接.

在 GitHub 上获取对 Unreal Engine 资源的访问权限
生成 GitHub 个人访问令牌(经典)
  • 仅启用权限 [读取:软件包] ,

  • 生成令牌 - 请妥善保存此值,您将无法再次看到它.

对你的服务器构建有信心? 跳到 Unreal Engine 以及 高级功能.

⚙️ 1. 配置项目

无论您使用的是 Windows、Mac 还是 Linux 机器,您将 需要为 Linux 运行时构建您的服务器,因为如今大多数云提供商(包括 Edgegap)都运行在 Linux 上。别担心,不需要具备 Linux 知识。

这种方法无需下载 Unreal Engine 源码,也无需从源码构建!

☑️ 先 验证你的 Unreal Engine 版本 - 已根据你的项目文件预填值。

☑️ 输入 GitHub 用户名和 PAT 来自 Unreal Engine,用于从 GitHub 下载依赖项。

生成 GitHub 个人访问令牌(经典)
  • 仅启用权限 [读取:软件包] ,

  • 生成令牌 - 请妥善保存此值,您将无法再次看到它.

☑️ 禁用 Unreal Engine 版本兼容性检查 用于专用服务器和 设置 IpNetDriver 作为默认驱动或备用驱动 用于复制网络:

☑️ 重启 Unreal Engine 以重新加载最新更改。

☑️ 创建专用服务器目标脚本 通过复制你的 <PROJECT>Editor.Target.cs 项目根文件夹中的文件并将副本重命名为 <PROJECT>Server.Target.cs.

☑️ 替换任何对 单词 Editor Server 在你的服务器目标脚本中。

☑️ 修改服务器构建默认设置 通过编辑你的服务器目标脚本:

✅ 你现在可以继续下一步。

可选:Steam 集成

集成 Steam,使用 IpNetDriver 作为默认网络驱动并确认 适用于 Linux 的 64 位 steamclient.so 已复制到镜像中的路径 /home/ubuntu/.steam/sdk64/ .

下载 steamclient.so

🔧 2. 构建游戏服务器

现在我们将构建并烹饪你的项目,并将其打包为一个易于复用的 Docker 镜像。

在一个开发者团队中工作意味着要共享代码。当出现问题时,您最不想听到的就是“在我的机器上可以运行”。游戏服务器必须能够在任何机器上可靠运行,因为成功的游戏服务器会在世界各地成千上万台服务器机器上运行。

为了帮助使您的服务器可靠,我们使用 Docker —— 一种虚拟化软件,确保您的所有服务器代码依赖项直到操作系统级别始终完全相同,无论服务器如何或在哪里启动。

我们建议观看 “永远不要本地安装”(视频). 使用 Docker 不需要使用 Dockerhub。Docker ≠ Dockerhub。把 Docker 想象成一个编程引擎,把 Dockerhub 想成它的应用商店。

☑️ 你可以配置以下选项(或保留默认值):

  • 镜像名称 是你自定义的唯一标识,用于在发布前标记你的服务器构建。

    • 通常会包含你的游戏名称——例如“my-game-server”。

  • 镜像标签 是指向你镜像某个特定版本的标识。

    • “构建产物”这一术语有时也用于指代你镜像的特定版本。

    • 时间戳是一个很好的标签选项,例如 2024.01.30-16.23.00-UTC (默认)。

☑️ 构建项目 当你对配置满意后即可进行。完成此步骤后,你的本地 Docker 客户端中将新增一个包含 Linux 游戏服务器可执行文件的新镜像。

✅ 现在你可以进入下一步了。

🧪 3. 在本地测试服务器

让我们先在本地(在你的机器上)尝试部署并连接游戏客户端,以确保服务器映像在我们上传和部署(可能需要一些时间)之前能正常工作。

☑️ 选择你希望在本地运行的镜像标签 (远程镜像将会被下载)。可选地,还可以添加更多 docker run 参数 来定制你的本地测试:

  • -p 7777:7777/udp - 这是你本地容器的 端口映射,

  • -e ARBITRIUM_PORT_GAMEPORT_INTERNAL=7777 是一个 环境变量 用于模拟真实的 Edgegap 部署,告诉你的游戏服务器用于监听玩家连接的内部端口。

☑️ 当你对配置满意后,点击 启动本地服务器。完成此步骤后将会 启动一个新的容器 在你的开发机器上。

☑️ 现在该把你的 Unreal Engine 编辑器(PIE)游戏客户端连接到本地服务器容器了。使用 ~ 打开 Unreal PIE 控制台(波浪号键)并连接: open <ip>:<port>:

  • ip = localhost127.0.0.1 (在大多数情况下等价),

  • port = Docker GUI 中容器随机分配的外部端口值。

☑️ 一旦你确认可以连接到本地服务器容器并且能够正常游戏,就可以删除该容器 🗑️ 以释放机器上的资源供其他程序使用。

✅ 现在你可以进入下一步了。

故障排查和常见问题

无法将客户端连接到服务器 - 请求超时。 , 请求超时 , 连接失败 ,或 端口验证失败

  • 首先,确保容器已启动,并且日志中没有运行时错误。

  • 请验证你在 docker run 命令中的端口值是否一致。

  • 请确保你的游戏客户端连接的是 外部端口 ,该值显示在你的容器详情页上,出于安全原因,这个值始终会随机生成。

  • 请确保你已按步骤所述重命名目标文件并配置游戏构建 ⚙️ 1. 配置项目.


我的容器已启动,但在之后的几分钟内我仍然无法连接。

  • 容器启动后,你的游戏引擎初始化就会开始。这个过程可能从几秒到几分钟不等,在此期间服务器不接受玩家连接。

  • 可以考虑优化服务器初始化,以缩短这段时间。

  • 游戏客户端应以 1 秒间隔重试连接一段有限的时间(取决于你的初始化时长),之后应返回匹配流程。

  • 可以考虑添加一个加载场景,这样服务器可以在与客户端同步状态的同时进行初始化(在 Unreal Engine 中还可完成地图切换)。


警告:无法为绑定地址创建 socket

  • 请通过 Fab 资源商店安装 Epic 的 Steam Subsystem 插件。

  • 当使用从 github 下载的 SteamCore 源码版本的 Edgegap Integration Kit(EGIK)时,由于 Epic Games 的插件分发政策,不包含 Epic 的 Steam Subsystem 插件。


我已连接,但屏幕完全是黑的。

  • 请确认你设置了正确的 游戏默认地图 ,位于 编辑 / 项目设置 / 地图与模式.

☁️ 4. 发布到 Edgegap

是时候将您的服务器上线了!既然您的镜像现在可以成功托管玩家,我们就可以将其上传到 Edgegap 并开始在世界任何地方运行。在本指南中,我们将使用 Edgegap 的容器注册表 (镜像的存储)。

☑️ 选择一个应用名称 用于在 Edgegap 上标记和分组相似镜像。

☑️ 选择你希望发布的镜像标签 以及 上传镜像。完成此步骤后,你的服务器镜像将上传到 Edgegap Registry,并在浏览器中创建一个新的 应用版本请务必创建你的 端口映射 当提示时, 使用默认值.

✅ 现在你可以进入下一步了。

疑难解答与常见问题

被拒绝:添加 756.6 MiB 的存储资源,更新为当前使用量 4.3 GiB 后将超过配置的上限 4.7 GiB , 在引用 "layer-sha256:--------" 上提交失败:对 https://registry.edgegap.com/ 的 PUT 请求返回了意外状态

  • 看起来您在以下位置的镜像存储空间已用尽 容器注册表。请考虑删除未使用的构建产物(如果有)或优化服务器构建体积。如果使用自定义 Dockerfile 或 .dockerignore,您可能将一些不需要的文件复制到镜像中。


您已达到应用数量上限 2 , 无法更新 docker 标签/版本:您已达到应用版本数量上限 2

  • 您已达到我们免费等级的限制,请考虑升级您的账户。或者,您可以通过我们的界面删除现有资源 仪表板.


我的新应用版本未在插件/扩展中列出。

  • 请确保您在上一步已完成应用版本创建表单。

🚀 5. 部署到云端

这是本指南的最后一步,完成后您将在 Edgegap 云上部署一个服务器,来自世界任何地方的玩家都可以连接到该服务器。

☑️ 选择一个应用程序和版本 从先前的步骤部署。

☑️ 一旦准备好,请点击 部署到云端,等待达到 部署。完成此步骤将导致 一个新的部署被启动 在您的 Edgegap 帐户上。

☑️ 验证控制台输出中没有新的错误。同时确保您的 部署 没有显示任何错误,并且您的 部署 未显示 100% 的资源利用率(vCPU 或内存),否则新的玩家连接可能会被拒绝,或您的服务器可能会陷入重启循环。请参阅下面的故障排除步骤以解决任何问题。

☑️ 现在我们将进行最后的测试,并 将你的 Unreal Engine 编辑器连接到云端部署。请获取你的 部署主机 ,替换服务器 IP 和部署的 外部端口,在游戏客户端中打开 Unreal 控制台(波浪号 ~)并输入 open {host}:{port} .

您在 Edgegap 云上的部署的外部端口将随机选择,以便在潜在攻击者(黑客)造成损害之前减缓并检测到他们。

☑️ 一旦您确认可以无问题连接到您的部署并完成测试, 停止您的部署 以释放您账户中的容量用于下一次构建。

🙌 恭喜您在 Edgegap 上完成首次部署!如果您想了解更多,请继续阅读。

故障排查和常见问题

无法将客户端连接到服务器 - 请求超时。 , 请求超时 , 连接失败 ,或 端口验证失败

  • 首先,确保部署状态为 Ready,并且部署日志中没有运行时异常或错误。如果你的部署已停止,请在我们的 仪表板.

  • 请验证你服务器构建的网络代码设置中的端口配置是否与你的 应用版本中的内部端口一致。对于插件构建,端口会自动为你设置。你可以通过编辑 应用版本 而无需重新构建。请在你的网络代码集成中查找协议。

  • 请确保你的游戏客户端连接的是 外部端口 ,该值显示在你的部署详情页上,出于安全原因,这个值始终会随机生成。

  • 请确保你已按步骤所述重命名目标文件并配置游戏构建 Unreal Engine.

  • 你是否位于中国并正在使用 智能舰队?你的连接可能会被防火长城阻止。可以考虑在你的舰队中添加位于中国的服务器,或者使用 VPN 连接。


我的部署已就绪,但之后的几分钟内我仍然无法连接。

  • 一旦部署进入 Ready 状态,你的游戏引擎初始化就会开始。这个过程可能从几秒到几分钟不等,在此期间服务器不接受玩家连接。

  • 可以考虑优化服务器初始化,以缩短这段时间。

  • 游戏客户端应以 1 秒间隔重试连接一段有限的时间(取决于你的初始化时长),之后应返回匹配流程。

  • 可以考虑添加一个加载场景,这样服务器可以在与客户端同步状态的同时进行初始化(在 Unreal Engine 中还可完成地图切换)。


警告:无法为绑定地址创建 socket

  • 请通过 Fab 资源商店安装 Epic 的 Steam Subsystem 插件。

  • 当使用从 github 下载的 SteamCore Integration Kit(SIK)源版本的 Edgegap Integration Kit(EGIK)时,由于 Epic Games 的插件分发政策,不包含 Epic 的 Steam Subsystem 插件。


我已连接,但屏幕完全是黑的。


我的部署已停止/重启,而且我再也无法访问它的日志了。

  • 如果服务器进程因异常而崩溃,我们的系统会尝试自动重启服务器。建议先在本地测试服务器,以找出根本原因。

  • 我们只会在部署期间保留日志;如果你希望在部署停止后查看日志,请 集成第三方日志存储.

  • 参见 部署 以了解导致部署停止的所有原因。


我的部署在 X 分钟后自动停止了。

  • 免费层部署有 60 分钟限制,请考虑升级你的账户。

  • 根据我们的服务器清理政策、为了基础设施维护,以及防止在部署未正确关闭时产生意外费用,所有部署在运行 24 小时后都会终止。对于长时间运行的服务器,请考虑使用 私有舰队 配合 持久化.

  • 参见 部署 以了解导致部署停止的所有原因。


如果玩家离开我的部署,会发生什么?

  • 默认情况下,服务器不会拒绝玩家连接。玩家认证由你的开发者自行处理,因为可以使用许多不同的方法和玩家认证提供商。

  • 游戏客户端可能会在本地存储连接信息,以便在客户端意外崩溃时尝试重新连接。

  • 若想允许玩家加入进行中的游戏,可以考虑使用 深入了解会话.


我的服务器在变为就绪后显示 100% CPU 占用。

  • 这可能并不是问题,因为游戏引擎在服务器初始化期间往往会执行 CPU 密集型操作。如果在部署开始后的 2-3 分钟内 CPU 使用率没有下降,你可能需要优化服务器或增加应用版本资源。

  • 降低 tick rate 有助于通过减少处理消息的数量来控制 CPU 使用率。

  • 在免费层中,你的资源限制为 1.5 vCPU 和 3GB 内存(RAM)。

  • 你可以在创建新应用版本时增加分配的资源。你也可以在我们的仪表板中复制你的应用版本并按需调整这些值,而无需重新构建服务器或镜像。


我的部署反复重启并显示错误 OOM kill

  • 这是由于超出了分配的内存量。可以考虑使用对象池、压缩,或移除场景中不需要的对象来优化内存使用。

  • 在免费层中,你的资源限制为 1.5 vCPU 和 3GB 内存(RAM)。

  • 你可以在创建新应用版本时增加分配的资源。你也可以在我们的仪表板中复制你的应用版本并按需调整这些值,而无需重新构建服务器或镜像。


有时,我服务器的内存(RAM)使用量会猛增到很高,这有问题吗?

  • 只要你没有超过分配给应用版本的内存量,这就不是问题。

  • 超过分配给应用版本的内存量将导致 OOM kill (见上文)。


我的服务器性能会受到同一台机器上运行的其他服务器影响吗?

  • 不会,我们的平台可确保分配的资源不会被其他工作室或共享基础设施上的其他服务器使用。使用 Edgegap,不会有“噪声邻居”。

👉 下一步

一旦你有了可用的客户端/服务器设置,请确保 保存你的项目副本 (使用诸如 git 之类的版本控制软件),以便在遇到问题时总能追溯你的步骤。

继续阅读以了解更多与服务器生命周期和可发现性相关的主题。

停止部署

比赛结束(或玩家离开)后,可以停止你的部署以节省成本。 空跑或仅部分填充会不必要地增加你的成本!

如果你按照本指南并使用我们的 Docker 扩展进行了构建,你只需调用方法 FGenericPlatformMisc::RequestExit 。我们已经在打包镜像中添加了一个管理服务器进程的脚本,它会自动执行优雅的部署关闭。

若要自定义服务器生命周期管理,请修改我们的 示例 StartServer.sh 脚本。

更希望从 Unreal 中管理生命周期?请参阅 开发者工具 了解自停止 API 蓝图。

注入变量

通过访问注入的环境变量,可以读取有用的信息,如部署 ID、服务器 IP 地址、服务器位置等。每个部署会自动包含:

服务器性能分析

要理解并优化 Edgegap 上的服务器性能问题,请探索 部署, 部署,以及更多 部署 你可使用的工具。

你还可以将现有的 Unreal Engine 性能分析工具与 Edgegap 一起使用:

会话自动化

使用以下任一方式,自动化热门游戏流程,以管理会话并按需扩展:

匹配:

  • 更短的回合

  • 按需对局

  • 技能评级和/或 自定义规则

服务器浏览器:

  • 持久模式或回合制

  • 社交区域枢纽

  • 自动分配和/或 自定义搜索

自定义后端:

优化构建

配置资源分块,以将仅客户端资产与服务器资产隔离开。

排除仅供客户端使用、且服务器运行不需要的资产和插件。

检查你的内容烹饪策略。

实施关卡流式加载,以减少运行时内存负载。

只包含服务器运行绝对需要的内容。

  • 将未使用的文件复制到镜像中会导致镜像臃肿、上传更慢、缓存更慢,以及整体服务器启动更慢。 查看 Docker 镜像优化建议.

示例 .dockerignore 文件以移除额外文件。

考虑使用 多阶段 Docker 构建(链接).

  • 将大型服务器依赖项拆分到单独的镜像中,以便在多阶段构建中复用。Docker 会缓存每一层,并简单复用上一版本,除非明确指示,否则会跳过上传这一部分,从而为你节省带宽和等待上传完成的时间。

  • 如果你不确定为什么某个 Dockerfile 命令会报错,可以尝试在本地调试。在问题发生前新建一个阶段(添加第二个 FROM 命令),使用 --target 指示构建过程停在有问题的阶段,然后 docker exec -it {container} /bin/bash 进入容器内的交互式终端。之后,你可以使用基础镜像中的 shell 命令进一步排查(例如 top 在 Ubuntu 上)。

自定义镜像

对于由于构建体积优化、额外依赖,或需要更复杂启动流程而希望对镜像拥有更多控制的用户,我们也支持添加你自己的 Dockerfile。接下来我们将分享一些“自己动手”的技巧和最佳实践。

始终确保您正在使用可运行的服务器构建。

  • 在认为问题与自定义 Dockerfile 有关之前,请确保您的 Unity 服务器构建可以启动,并且 Unity 的构建过程中没有抛出任何异常或错误。

在上传之前务必本地测试。

  • 在本地测试您的镜像可以在等待上传完成时为您节省大量时间。它也是完全免费的 ✨,因为不需要任何 Edgegap 资源。

  • 在本地测试时,请确保正确设置内部端口:

确保掌握基础知识。每个 Dockerfile 都需要一些基本命令:

  • FROM {image} 是您的基础镜像,对 Unity 项目我们通常使用长期支持的 Linux,但任何基于 Linux 的基础镜像都可以。它们通常是存储在 dockerhub 的公共镜像。Dockerfile 参考在此处。 Dockerfile 参考在此处.

  • COPY {source} {destination} 用于将您的 Linux 服务器构建从主机复制到镜像内部,以便稍后可以启动它。 Dockerfile 参考在此处.

  • USER {user} 应跟在 useradd(ubuntu)命令 或同等命令之后,最好不要以 root 运行所有内容,以更安全为宜。 Dockerfile 参考在此处.

  • CMD {command} 将是最后一行,很可能会调用一个 StartServer.sh 或某种启动脚本,以确保在一切设置完成后服务器正确初始化。 Dockerfile 参考在此处.

  • 切勿使用 VOLUME - 在 Edgegap 上您将无法通过这种方式挂载任何本地存储,建议考虑我们的端点存储功能并使用 S3 存储桶,参见 端点存储,

  • EXPOSE 7777/UDP 不是必需的!这并不会真正使容器外部能够访问内部服务器端口,它只是对开发者的一个提示,并且在本地测试时该端口需要被

将参数声明延迟到最晚的可能时刻。由于服务器构建时间较长,可配置性优于可组合性。 将此方法应用于 Dockerfile 命令以更快地构建和上传。

  • 场景:您需要定义诸如部署阶段、版本、游戏模式、地图、每台服务器的玩家数量、备份频率或类似参数。

  • 糟糕的解决方案:为参数的每一种组合创建单独的镜像。您会花大量时间重建镜像,而这种方法带来的收益很少。

  • 更好的解决方案 — 及时替换配置参数:

    1. 部署参数 — 在部署前提供 — 比如作为环境变量传入的匹配器选择器,或在部署时由您自定义的会话管理系统传入的环境变量,

    2. 版本参数 — 在某个应用版本的所有部署中共享 — 部署阶段、构件标签、第三方密钥和端点等;然后

    3. 单一镜像 — 在启动时包含并加载所有配置选项。

切勿在 Edgegap 部署上运行数据库。

  • Edgegap 部署并不适合长期运行的进程,可能在长时间运行后被终止且不会事先通知。以这种方式运行的数据库(即使是分布式的)可能会被终止并导致不可逆的数据丢失。如果您需要数据库,请考虑第三方的 DBaaS。

  • 考虑使用我们的 托管集群 来托管数据库和长期运行的服务。

最后更新于

这有帮助吗?