1.5 动手:从零跑通一个最小监听服务器
理论够了,先跑通一个能联机的最小环境。这一节的目标:编辑器里一键开 2 人联机,命令行起专用服务器,最后用网络仿真模拟差网络,验证你的代码在烂网络下能不能活。
方式一:编辑器多人(最快,5 秒)
- 编辑器顶栏「设置」旁找到 Number of Players,从 1 改成 2
- 可选:勾上 Run as Listen Server、Use Single Process(单进程多窗口,调试方便;取消勾则启动多个独立进程,更接近真实环境)
- 点 播放(Play)。会弹出第二个视口/窗口,Alt+Shift 切换输入焦点到另一个客户端
这就是一个监听服务器 + 一个客户端的最小联机环境。注意:单进程模式下两个端的日志混在一起,用 print 调试时要带前缀区分(后面章节讲日志规范)。
方式二:命令行启动专用服务器
打包或从编辑器启动服务器:
# 编辑器内启动专用服(PIE 之外的独立进程)
UE5Editor.exe YourProject.uproject /Game/Maps/YourMap?listen -server -log
# 打包后的服务器(Server Target)
YourServer.exe /Game/Maps/YourMap?MaxPlayers=8 -log
# 客户端连接服务器
YourClient.exe 127.0.0.1:7777
默认端口 7777。地图名后用 ? 挂参数(?listen 表示监听服、?ServerName=xxx 自定义)。上线正式服相关设置见「设置专用服务器」(DS)。
连接成功后,stat net(控制台)能看实时网络统计:PktLoss(丢包)、Ping、InBps/OutBps(上下行带宽)——这是你判断「同步是否健康」的第一道仪表。
方式三:网络仿真——故意把网络搞烂
本地联机太流畅会掩盖问题。网络仿真(Network Emulation) 能模拟延迟、丢包、抖动:
# 控制台开启仿真:100ms 延迟 + 2% 丢包(双向)
Net.PktLoss=2
Net.LatencyMode=1
Net.Latency=100
或在编辑器 → 网络设置面板里直接拖「模拟延迟」「丢包率」滑块。先在本机用 100ms/2% 跑一遍你的游戏:角色移动还跟不跟手?受击反馈几秒后才蹦出来?技能命中是否一致?所有联网功能上线前必须过这一关——这是我发现「客户端预测没开导致角色瞬移」问题的标准手段。
验证清单
最小环境跑通后,逐项确认:
- [ ] 两个客户端能看到对方的角色移动
- [ ] 服务器上 spawn 的复制 Actor,两个客户端都能看到
- [ ] 一个客户端销毁(服务器销毁)某 Actor,另一客户端同步消失
- [ ]
stat net无持续 PktLoss,带宽在预期范围 - [ ] 开 100ms 延迟后,本地操作仍流畅(本地预测在工作)
- [ ]
log里无Net相关警告刷屏
常见「跑不通」排查
| 现象 | 可能原因 |
|---|---|
| 客户端连上但看不到对方 | Pawn 未设 bReplicates / PlayerController 相关性配置 |
| 对面动作瞬移 | 缺少模拟代理插值 / 更新频率过低 |
| 双击/操作延迟巨大 | 未开客户端预测,一切等服务器回包 |
| 第二客户端黑屏 | Number of Players 未生效,或地图未正确加载(检查 GameMode 默认地图) |
| 端口连不上 | 防火墙拦截 7777;或服务器未加 -server/-listen 参数 |
心得:把「方式一 + 方式三」的组合当成日常开发默认配置——一边开发一边就在烂网络下测试,联网相关的 bug 会提前 80% 暴露。别等到项目后期才想起来测网络。官方「多人游戏编程快速入门」(https://www.wanxiangyundang.top/read/unreal-engine-5-8-docs/multiplayer-programming-quick-9305-p1)与本节配套食用效果更佳。
