1.5 动手:从零跑通一个最小监听服务器

理论够了,先跑通一个能联机的最小环境。这一节的目标:编辑器里一键开 2 人联机,命令行起专用服务器,最后用网络仿真模拟差网络,验证你的代码在烂网络下能不能活。

方式一:编辑器多人(最快,5 秒)

  1. 编辑器顶栏「设置」旁找到 Number of Players,从 1 改成 2
  2. 可选:勾上 Run as Listen Server、Use Single Process(单进程多窗口,调试方便;取消勾则启动多个独立进程,更接近真实环境)
  3. 点 播放(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)与本节配套食用效果更佳。