恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
UE5.8 Dedicated Server打包部署与联机调试完整指南
首页
资讯中心
/
UE5.8 Dedicated Server打包部署与联机调试完整指南
UE5.8 Dedicated Server打包部署与联机调试完整指南
发布时间:2026/9/2 4:02:19
这次我们直接看一个 UE5.8 联机开发里相对麻烦的完整闭环从项目里打包出服务器端把服务器部署到本机或云主机再从客户端连上去最后靠打印日志和信息输出确认联机状态。很多人做单人内容很熟练一到多人联机就卡在“服务器端打不出来”或“客户端连上以后不知道服务器到底收到没有”这一步这篇文章把这条链路完整走一遍。UE5.8 依然延续 UE5 的联机架构可以用 Dedicated Server 提供无渲染的服务器端也可以用 Listen Server 让主机玩家兼任服务器。对于大多数中小型合作、竞技和局域网联机项目Dedicated Server 是更稳定、更适合部署的方案对于只想快速验证的玩法原型Listen Server 更省事。本文重点放在 Dedicated Server 的打包、部署、连接和调试。全文会按“环境准备 - 项目设置 - 打包服务器端 - 部署服务器端 - 连接服务器 - 打印调试信息 - 问题排查”的顺序展开适合做多人项目的 UE 开发者、需要把联机内容交付给测试伙伴的独立开发者以及准备把服务器端部署到云主机上跑长稳测试的团队。1. 核心能力速览项目说明引擎版本虚幻引擎 5.85.x 通用思路联机架构Dedicated Server / Listen Server核心要解决的问题服务器端打包、部署、客户端连接、联机调试信息确认支持部署平台Windows Server、Linux 云主机网络要求局域网直连优先公网联机需配置端口转发或云主机安全组调试手段UE_LOG 日志、屏幕打印、控制台命令、日志文件是否支持批量任务支持可用脚本批量打包、批量启动服务器、自动化测试难度中等纯蓝图项目需要先建立 C 编译入口投入成本一台开发机 一台测试服务器即可完成全部流程2. UE5.8 联机架构与使用边界2.1 两种服务器模式怎么选Dedicated Server 的价值在于服务器端不渲染画面、不处理输入专门跑游戏逻辑稳定性和公平性都更好。它适合正式的联机版本、需要服务器长期运行的场景。Listen Server 的价值在于省一台服务器玩家开房间后其他玩家连进来主机玩家也是其中一员。它的缺点是所有逻辑都跑在玩家机器上主机掉线整个房间就没了遇到网络差的主机会影响其他玩家。想做“打包服务器端并部署到服务器”这个流程Dedicated Server 是首选。UE5.8 在 Project Launcher 和 RunUAT 里都保留了服务器端打包能力下面会讲两种方式。2.2 适用场景与边界适合这样的项目局域网合作、局域网对战游戏。云服务器上跑 Dedicated Server 的小型多人玩法。需要联机联调排查“服务器是否收到客户端消息”的工程问题。准备做 CI/CD 打包把服务器端和客户端一起自动化构建。不适合做大而全的架构大规模 MMO这种量级需要专门的网络框架、分区服务和数据库方案单靠 Dedicated Server 不够。需要严格同步、反作弊和专用物理服务器的商业项目需要更完整的架构设计。如果只是想快速验证玩法先跑 Listen Server 更省时间不要一上来就搭 Dedicated Server。合规提醒部署服务器时要保证项目素材、图片、音效、字体都有合法授权服务器上如果存了玩家账号或隐私数据必须加密存储并做好访问控制联机测试用测试服不要直接连生产数据库。涉及收集用户信息时需要符合所在国家和地区的隐私合规要求在测试环境验证后再考虑正式发布。3. 环境准备与前置条件3.1 开发机环境打包服务器端需要一套完整的 UE5.8 开发环境操作系统Windows 10 或 Windows 11 开发机。引擎虚幻引擎 5.8从 Epic Games Launcher 安装或源码构建均可。编译环境Visual Studio 2022安装时勾选“使用 C 的游戏开发”工作负载。磁盘空间项目本身加上 Cook 的中间文件建议预留 50GB 以上实际占用要看项目资源量。网络需要能访问内部服务器或云主机方便上传部署包。如果项目是纯蓝图项目需要在项目里手动创建 Source 目录的 Target 文件并添加一个最小的 C 类让引擎进入 C 项目模式。这一步不做很多打包界面不会出现 Server Target 选项。3.2 服务器端环境Dedicated Server 不需要显卡渲染但需要一个能稳定运行的进程环境和网络端口Windows 服务器Windows Server 2019 或 2022安装必要的 VC 运行库。Linux 服务器Ubuntu 20.04 或 22.04 比较常见需要可执行权限。端口游戏默认端口 7777协议为 UDP需要放行防火墙和安全组。公网服务器如果是云主机在安全组规则中放行 UDP 7777如果是家用机做服务器需要在路由器做端口转发。这里重点检查一件事防火墙 UDP 端口放没放。很多人客户端连接被拒不是项目问题是运维层面的端口没开。3.3 检查清单检查项说明Visual Studio 2022已安装 C 游戏开发组件UE5.8已安装并能打开项目服务器系统Windows Server 或 Linux 系统已就绪放行端口UDP 7777 已放行网络互通客户端能 ping 通服务器 IP4. 项目设置与服务器 Target4.1 项目基本网络设置打开项目设置在 Maps Modes 中确认默认地图、GameMode 已指定。联机项目建议做一个专门的联机测试地图地图中放置玩家出生点。在Config/DefaultEngine.ini中确认网络配置是否合理例如[/Script/OnlineSubsystemUtils.IpNetDriver] MaxClientRate100000 NetServerMaxTickRate30这两个参数影响服务器端网络更新频率不需要照抄按项目需求调整。局域网测试时默认值通常够用。4.2 创建 Server Target要让引擎能打出 Dedicated Server需要给项目创建 Server Target。在项目的Source目录下新建一个项目名Server.Target.cs文件例如项目叫MyGame就创建MyGameServer.Target.cs// Source/MyGameServer.Target.cs using UnrealBuildTool; public class MyGameServerTarget : TargetRules { public MyGameServerTarget(TargetInfo Target) : base(Target) { Type TargetType.Server; DefaultBuildSettings BuildSettingsVersion.Latest; IncludeOrderVersion EngineIncludeOrderVersion.Latest; ExtraModuleNames.Add(MyGame); } }如果项目里已经有一个项目名.Target.cs参考它的命名空间和模块名把Type改成TargetType.Server即可。这个文件写好后重新生成项目文件Visual Studio 里会多出一个MyGameServer的编译目标。需要注意如果项目是纯蓝图项目Source目录可能不存在。先随便创建一个 C 类例如从 GameModeBase 派生的MyGameMode保存后让引擎生成模块代码然后再补 Target 文件。这样引擎才会识别并编译 Server Target。4.3 启用必要的网络插件如果要做 Steam 联机需要启用 Online Subsystem Steam 插件并在DefaultEngine.ini中配置[OnlineSubsystem] DefaultPlatformServiceSteam [OnlineSubsystemSteam] bEnabledtrue SteamDevAppId480SteamDevAppId480是开发占位符实际项目需要换成真实的 Steam AppID。如果只做局域网 IP 直连不需要启用 Steam 插件直接用默认的 Null Online Subsystem 即可。4.4 确认服务器地图打包打包服务器端时必须保证服务器需要的地图被打包进去。在项目设置的 Packaging 或 Cook 设置中把联机测试地图加入 Additional Maps to Cook否则服务器启动时可能找不到地图直接导致服务器进程起不来或客户端连接后加载失败。5. 打包服务器端5.1 方式一Project Launcher打开Window - Project Launcher创建一个自定义打包任务。在配置界面中重点关注Build Target选择MyGameServer。Build ConfigurationDevelopment 或 Shipping测试用 Development正式部署用 Shipping。Cook选择要打包的地图及平台。Stage/Package选择输出目录。创建完成后点击 BuildUE5.8 会自动编译服务器代码、Cook 地图资源最后 Stage 到本地目录。Project Launcher 的好处是可视化适合手动打包坏处是配置项分散不同引擎版本界面略有差异。如果你只打算手动打一次包这种方式最直接。5.2 方式二RunUAT 命令行命令行方式更适合自动化也更容易复现。Windows 开发机打包 Win64 服务器UE5.8安装路径\Engine\Build\BatchFiles\RunUAT.bat BuildCookRun ^ -projectD:\Projects\MyGame\MyGame.uproject ^ -noP4 ^ -platformWin64 ^ -clientconfigDevelopment ^ -serverconfigDevelopment ^ -cook ^ -build ^ -stage ^ -server ^ -nocompileeditor ^ -unversioned ^ -pak打包 Linux 服务器UE5.8安装路径\Engine\Build\BatchFiles\RunUAT.bat BuildCookRun ^ -projectD:\Projects\MyGame\MyGame.uproject ^ -noP4 ^ -platformLinux ^ -clientconfigDevelopment ^ -serverconfigDevelopment ^ -cook ^ -build ^ -stage ^ -server ^ -nocompileeditor ^ -unversioned ^ -pak打包 Linux 服务器通常需要额外的交叉编译工具链。如果你的项目用了第三方 C 库还需要在 Linux 环境下准备对应的编译版本。这是最常见的打包失败点之一。命令里几个关键参数-platformWin64或-platformLinux服务器端的目标平台。-server告诉 RunUAT 同时构建服务器端。-stage把结果整理到可运行的目录。-pak把资源打包成 Pak正式部署建议打开。5.3 打包输出目录打包完成后输出目录通常包含MyGame/ ├── MyGameServer.exe ├── MyGame/ │ ├── Binaries/ │ ├── Content/ │ │ └── Paks/ │ └── Saved/Linux 版本对应可执行文件一般是MyGameServer没有 .exe 后缀。5.4 验证服务器可执行文件打包结束后先在本机最小验证一次不要直接传服务器。在命令行里启动MyGameServer.exe MyGame -log -port7777如果本机能启动说明打包产物是完整的。接着用编辑器内客户端执行open 127.0.0.1:7777能连通再把包上传到服务器。6. 部署服务器端与启动参数6.1 Windows 服务器部署把打包目录拷贝到 Windows 服务器后在命令行进入目录执行MyGameServer.exe MyGame -log -port7777其中MyGame是地图名-log会打开日志输出窗口-port7777指定监听端口。如果只需要在后台无控制台窗口运行可以去掉-log日志会写到Saved/Logs/目录。测试阶段建议保留-log方便实时观察服务器状态。6.2 Linux 服务器部署打包 Linux 服务器端后先上传到服务器scp -r MyGame/* ubuntuyour-server-ip:/opt/MyGame/进入目录后给可执行文件加权限并启动cd /opt/MyGame chmod x MyGameServer ./MyGameServer MyGame -log -port7777Linux 服务器启动时日志输出到 stdout如果使用 nohup 或 systemd 托管需要把 stdout 重定向到日志文件nohup ./MyGameServer MyGame -log -port7777 server.log 21 6.3 关键启动参数一览参数作用-log启动日志输出窗口或标准输出-port7777指定 UDP 监听端口-unattended不显示对话框适合自动化部署-server以服务器模式运行服务器可执行文件默认就是-nullrhi不初始化渲染设备Dedicated Server 可以加6.4 防火墙与端口启动前检查 Windows 防火墙或云主机安全组# Windows 服务器添加 UDP 7777 入站规则 netsh advfirewall firewall add rule nameUE5Server dirin actionallow protocolUDP localport7777Linux 用 ufw 放行端口sudo ufw allow 7777/udp如果服务器已经启动但客户端连不上先用本机 telnet 或 UDP 工具验证端口是否可通。注意游戏用的是 UDP不是 TCP普通的 telnet 验证效果有限可以通过服务器日志确认连接请求是否到达。7. 连接服务器与联机验证7.1 准备客户端客户端打包方式和服务器端类似在 Project Launcher 或 RunUAT 中把 Build Target 选为MyGame平台选 Win64。打包出的MyGame.exe就是客户端。7.2 在编辑器中直接连接技术验证阶段不需要先打客户端包。直接在编辑器里点击 Play 后按键盘波浪键打开控制台输入open 192.168.1.100:7777如果服务器就是本机可以输入open 127.0.0.1:7777客户端会尝试连接指定 IP 和端口。连接成功后GameMode 的PostLogin会触发地图加载完成进入游戏。7.3 使用蓝图 Open Level 连接在客户端 UI 或 GameMode 初始化时可以用蓝图节点 Open Level 连接服务器关卡名称192.168.1.100:7777。使用 Open Level 节点时字段填服务器 IP 加端口。这个方式适合做游戏内多人连接界面。如果你在做大厅 UI把服务器 IP 做成可输入控件再绑定到 Open Level 节点即可。7.4 多客户端联机验证建议至少开两个客户端验证启动一个 Dedicated Server。在两个客户端分别执行open 192.168.1.100:7777。在服务器日志中查看PostLogin是否触发两次。在客户端观察对方角色是否出现。这一步能同时验证服务器端逻辑、客户端同步和角色生成流程。如果两个客户端互相看不到多半是 GameMode 设置或 PlayerStart 点的问题。8. 打印调试信息8.1 UE_LOG 输出到日志文件UE5 的联机调试最基础的手段是 UE_LOG。服务器端和客户端可以分别输出日志。在 GameMode 中重写PostLogin和Logout// MyGameMode.cpp void AMyGameMode::PostLogin(APlayerController* NewPlayer) { Super::PostLogin(NewPlayer); UE_LOG(LogTemp, Log, TEXT([Server] Player joined: %s), *NewPlayer-GetName()); } void AMyGameMode::Logout(AController* Exiting) { Super::Logout(Exiting); UE_LOG(LogTemp, Log, TEXT([Server] Player left: %s), *Exiting-GetName()); }在客户端判断当前 NetMode// 在 PlayerController 或 Character 中 if (GetNetMode() NM_Client) { UE_LOG(LogTemp, Log, TEXT(This is a client, connected to server.)); } else if (HasAuthority()) { UE_LOG(LogTemp, Log, TEXT(This process has authority over this actor.)); }GetNetMode()的常见返回值NM_Standalone单机。NM_DedicatedServerDedicated Server。NM_ListenServer监听服务器主机玩家就是服务器。NM_Client客户端。日志文件位置项目目录/Saved/Logs/项目名.log8.2 屏幕调试打印如果是客户端本地观察可以用蓝图节点 Print String 或 C 的打印函数if (GEngine) { GEngine-AddOnScreenDebugMessage(-1, 5.0f, FColor::Green, TEXT(Client connected to server!)); }屏幕打印只适合开发阶段看日志打印才是排查问题的核心手段。特别是 Dedicated Server 没有画面屏幕打印在服务器端看不到必须靠日志文件或控制台输出。8.3 控制台命令查看网络状态联机运行中在客户端或服务器控制台输入stat net stat fpsstat net会显示当前网络统计信息包括带宽、包数量、连接状态。这是验证客户端和服务器是否真正互通的重要工具。如果stat net里没有连接数据说明客户端根本没有建立网络连接。8.4 模拟网络延迟开发阶段想测试弱网表现可以在客户端控制台输入Net PktLag100Net PktLag100模拟 100ms 的额外网络延迟适合测试同步逻辑是否健壮。注意这只会影响当前进程的网络模拟不是永久配置。想要恢复传入 0 即可。这类命令能帮你提前发现客户端预测和服务器回滚的体验问题。8.5 看服务器日志判断联机链路服务器端启动后会自动生成日志里面会包含网络驱动初始化、端口监听、玩家加入等信息。如果客户端连接到了服务器日志里通常会看到类似下面的输出LogNet: Game client from 192.168.1.20:54321 accepted LogTemp: [Server] Player joined: PlayerOne如果看不到这类日志说明客户端根本没连上服务器优先查端口、防火墙和服务器进程状态。9. 常见问题与排查方法问题现象可能原因排查方式解决方案打包时找不到 Server TargetSource 目录缺少对应的 Target 文件检查项目 Source 目录创建项目名Server.Target.cs并重新生成项目文件纯蓝图项目打不出服务器端项目没有 C 编译入口检查项目类型添加一个最简单的 C 类让项目进入 C 模式Linux 服务器打包失败缺少交叉编译工具链查看打包日志安装 Linux 工具链或直接在 Linux 机器上用源码引擎打包客户端 open 127.0.0.1:7777 连不上服务器端没有启动或端口被占用查看服务器日志、检查端口netstat -ano公网服务器连接不上安全组或防火墙未放行 UDP检查云安全组和防火墙放行 UDP 7777局域网测试时放行防火墙服务器没有日志输出没有加日志参数检查启动命令加-log参数或查看 Saved/Logs 日志文件两个客户端看不到对方GameMode 或 PlayerStart 配置问题检查 PostLogin 日志确认服务器端地图的 GameMode 已设置出生点存在连接后立刻断开客户端和服务器版本或地图不一致查看双方日志保证客户端和服务器使用同一版本打包资源服务器启动就崩溃地图名错误或缺少 Cook 地图查看启动报错启动参数里改为正确的地图名检查 Cook 配置10. 最佳实践与使用建议10.1 第一次联机测试走最小闭环先在单机 Play 里确认 GameMode 能编译运行再打包 Server再在编辑器中用open 127.0.0.1:7777连接最后才上多客户端和公网测试。每一步都确认日志有输出不需要一上来就铺大型多人地图。最小闭环跑通后联机问题的排查范围会小很多。10.2 把打包脚本化服务器端打包和客户端打包建议写成脚本避免每次手动配置 Project Launcher。下面是一个 PowerShell 批处理模板$UE5Path C:\Program Files\Epic Games\UE_5.8\Engine\Build\BatchFiles\RunUAT.bat $Project D:\Projects\MyGame\MyGame.uproject $UE5Path BuildCookRun -project$Project -noP4 -platformWin64 -clientconfigDevelopment -serverconfigDevelopment -cook -build -stage -server -nocompileeditor -unversioned -pak用脚本的好处是可以连续打客户端和服务器端还能在 CI 环境里自动触发。团队里如果有多个人同时做联机开发建议把打包脚本提交到版本库统一打包配置。10.3 日志要分级别、分场景联机调试时不要把所有信息都打到屏幕上。建议连接生命周期用LogTemp或自定义 Log 分类输出。错误用 Error 级别警告用 Warning 级别。在DefaultEngine.ini中为指定模块开启详细日志。自定义 Log 分类可以这样声明DECLARE_LOG_CATEGORY_EXTERN(LogMyGameNet, Log, All); DEFINE_LOG_CATEGORY(LogMyGameNet); UE_LOG(LogMyGameNet, Warning, TEXT(Network state changed: %d), NetState);日志分类清晰后服务器日志里可以按关键字过滤连接排查效率会高很多。10.4 服务器部署要注意安全不要用 root 直接跑游戏服务器用低权限用户。如果服务器涉及玩家数据数据库必须单独部署并限制访问。Linux 服务器建议用 systemd 管理进程保证崩溃后自动重启。公网环境不要开放不必要的端口。一个简单的 systemd 服务模板可以参考[Unit] DescriptionMyGame Dedicated Server Afternetwork.target [Service] Userue5server WorkingDirectory/opt/MyGame ExecStart/opt/MyGame/MyGameServer MyGame -log -port7777 Restarton-failure RestartSec3 [Install] WantedBymulti-user.target10.5 多开测试自动化如果要批量启动多个服务器实例做压测可以写一个循环脚本for i in 7777 7778 7779 do nohup ./MyGameServer MyGame -log -port$i server_$i.log 21 done这样一台机器可以同时跑多个测试服每个端口独立方便验证不同版本或不同地图。批量启动前确认服务器端代码没有写在固定端口上的硬编码否则会出现端口冲突。10.6 涉及版权和隐私时的处理联机项目里如果用了第三方模型、贴图、音效、字体部署到公网服务器前要确认授权范围是否允许服务器分发。玩家昵称、IP、设备信息等数据属于个人数据建议只保留运行所需的最少信息日志中不要输出玩家完整 IP 或敏感字段测试环境用假数据验证即可。11. 总结与下一步这套流程里最值得先跑通的是“最小联机闭环”打出 Dedicated Server在编辑器里用open 127.0.0.1:7777连接确认PostLogin日志有输出。这步通了联机排错就有了稳定起点。最容易踩的坑有三个一是纯蓝图项目没有 Target 文件打不出服务器端二是服务器端打包出来以后忘了放行 UDP 端口三是客户端和服务器端版本不一致导致连接后闪断。先解决这三个问题再往下做玩家同步、背包同步和存档同步会顺畅很多。后续可以继续扩展的方向接入 Steam Online Subsystem 做大厅和邀请用 Jenkins 或 GitLab CI 自动化打包服务器端增加服务器端存档数据库以及用自动化脚本做多客户端长稳测试。如果你的项目能跑通本文这套最小闭环联机版就已经有了一个可以继续迭代的骨架。