5.1 服务器权威:哪些该权威,想清楚再写

核心结论

"联机毁项目"的根本原因不是网络代码,而是权威划分不清:客户端能自己改血量?两个客户端同时开宝箱?服务器从不下发结果?开始写代码前,把游戏里每个核心动作填进权威表——这张表能挡掉联机 80% 的 bug。

权威划分表(我的项目实例)

动作 权威 客户端 理由
移动 服务器校验 预测(CMC 自带) 手感不能等网络
普攻命中 服务器 播放动画(乐观显示) 防作弊
伤害结算 服务器 GE 收到后表现 防作弊
物品掉落 服务器 表现 防作弊
拾取 服务器判定距离 请求 RPC 防作弊+唯一性
开宝箱/开怪 服务器 表现 唯一性
任务完成 服务器 订阅复制 一致性
存档 服务器 只读复制 绝对单一来源
HUD/镜头 客户端 - 本地表现
输入 客户端 上报意图 响应快

核心原则:客户端负责"感觉",服务器负责"真相"。任何影响游戏结果的操作都要过服务器;任何纯表现的东西都留在客户端。

回合 vs 实时:两档实现

档位 A:2~4 人合作(推荐做法)

  • Listen Server(监听服务器):主机开房,主机兼服务器。开发简单、无需专门服务器,适合独立项目起步。
  • 权威在主机:所有判定走主机。
  • 切换成本低:后面再升级 Dedicated Server 时,改动集中在"服务器进程化"。

档位 B:独立服务器(上线形式)

  • 专用服务器托管(云/自建),玩家都是客户端。
  • 存档由服务器统一管理(对独立项目这甚至可以作为反作弊卖点)。

我的路径:M3 用 Listen Server 跑通联机(一个月);M5 发布前评估是否上 DS——最后选择 "Listen Server 房主制 + Dedicated Server 可选",因为 Roguelike 的局制短、房主退出的问题可以用"迁移主机"解决。

客户端预测与回滚(手感的关键)

有了权威划分后,手感就要靠预测:客户端按下攻击立刻播动画(不等服务器),服务器确认后效果拍板;如果服务器说"没打中",客户端回滚。

但 GAS 帮你做了大半: - 属性复制 + OnRep(客户端自动收到真实值)。 - GA 的 Local/Server 权限分离。 - 中小项目可以只对"移动"开预测,战斗用"乐观播放+服务器拍板"——这个折中让手感与正确性兼得。

一个易踩的坑:先播后回滚的"空挥"

客户端乐观播放攻击,但服务器判定"没中": - 不要播完整套命中反馈再回滚(玩家会看到"打中了又消失")。 - 做法:动画照播(这是真的"挥了"),命中反馈(粒子/飘字/顿帧)只在服务器确认后播。

命中反馈慢 100ms 可以接受(动作游戏 100ms 内玩家分辨不出),但错误反馈不可接受。

常见坑与解法

坑 1:主机自己一切正常,其他人异常(听服务器陷阱)

原因:Listen Server 的主机同时是服务器与客户端,单机代码在两边都能跑。

解法:开发期用 DS + 2 客户端的配置(-game -server 启动 DS)验证;定期"主机+1 客户端"测试。只测主机做不出联机。

坑 2:客户端权威的数据被复制(错误反向)

例子:客户端的"血量"被设成复制,客户端改了血量广播给所有人——血量永不一致。

解法:复制属性的 Set 权限只在服务器(bReplicated 的字段只在服务器写)。用蓝图 RPC 的"Server"修饰。

坑 3:作弊(客户端刷伤害)

原因:客户端算伤害并广播。

解法:客户端只发"意图"("我对 X 用了技能 A"),伤害由服务器算(GE 已经在服务器)。意图 + 服务器算 = 天然防作弊。

坑 4:主机退出导致全房失败

解法:主机迁移(服务器踢到另一玩家或直接会话结束并保存)。M3 就要决定,别拖到上线。

相关节点速查

  • 官方网络:https://www.wanxiangyundang.top/read/unreal-engine-5-8-docs/networking-and-multiplayer-in-e475
  • 带宽:https://www.wanxiangyundang.top/read/unreal-engine-5-8-docs/performance-and-bandwidth-tips-d100
  • Listen/DS 启动:-game -server 命令行

心得:权威表是我在项目开始前一个下午写出来的,贴在团队墙上。每当有人问"这个功能要不要广播",指指表就有答案。联机的复杂度可以靠纪律大幅压缩——前提是它在第一行代码之前。