unreal-multiplayer 是 poorvith-mp/skills-gamedev 中的一项开发技能资料,主题是 Unreal Engine 多人联机与网络同步开发。资料强调 Unreal 自 1998 年起即以多人竞技引擎为设计出发点,网络模型有明确倾向:以严格的服务器权威(Server-Authoritative)客户端-服务器架构为中心,由 GameMode、GameState、PlayerState、PlayerController 四类框架类协同组织。服务器运行权威的物理模拟,客户端主要是视觉与音频的播放终端,负责发送玩家意图。
主要能力按四个步骤展开:
第一步是核心玩法框架类。GameMode 仅存在于权威服务器,定义比赛规则、胜利条件、玩家生成(SpawnDefaultPawnAtTransform)与计分,不复制到客户端。GameState 复制到所有机器,跟踪比赛状态(回合时间、队伍比分、比赛阶段 WaitingToStart、InProgress、PostMatch)。PlayerState 复制到所有机器,跟踪单个玩家属性(玩家名、Ping、击杀数、当前分数)。PlayerController 存在于服务器与对应的拥有者客户端,负责输入转换、HUD 管理与安全的 Server RPC 通信。
第二步是 Actor 与属性复制。在构造函数中设置 bReplicates = true,物理 Actor 使用 SetReplicateMovement(true)。用 UPROPERTY(ReplicatedUsing = OnRep_Health) 复制变量,并在 GetLifetimeReplicatedProps 中通过 DOREPLIFETIME、DOREPLIFETIME_CONDITION(如 COND_OwnerOnly)声明复制规则。RepNotify 函数(如 OnRep_Health)会在服务器更新 Health 时于客户端自动执行。
第三步是 RPC 分类。Server RPC 标注 Server、Reliable、WithValidation,由拥有者客户端调用、在服务器执行,必须实现 _Validate 安全校验与 _Implementation。Client RPC 标注 Client、Reliable,由服务器调用、仅在拥有者客户端执行(例如显示命中标记)。NetMulticast RPC 标注 NetMulticast、Unreliable,由服务器调用、在服务器与所有模拟客户端执行(例如播放爆炸特效)。
第四步是网络相关性与休眠优化。IsNetRelevantFor 让超出视野距离或被地形遮挡的 Actor 不复制给远处客户端,以节省带宽。Net Dormancy(如 DORM_DormantAll)让静态或少变化的世界 Actor(箱子、开关)进入休眠,直到事件将其唤醒,以节省服务器 tick 开销。
资料还给出一个交付格式示例:一个服务器校验的武器开火 C++ 头文件,包含 AmmoCount 的 ReplicatedUsing 复制、OnRep_AmmoCount、带 WithValidation 的 ServerFire(使用 FVector_NetQuantize 与 FVector_NetQuantizeNormal)、Unreliable 的 MulticastSpawnMuzzleFX,以及 GetLifetimeReplicatedProps 重写。
案例部分描述一个 32 人 Unreal 射击游戏在交火时出现丢包、服务器 tick 降至 14 Hz。通过 NetProfile 与 Network Insights 诊断出武器开火使用了 Reliable NetMulticast RPC,并以每秒 30 次复制未量化的 64 位向量坐标。优化措施包括:将 FVector 改为 FVector_NetQuantize(16 位整数压缩)、把装饰性特效 RPC 从 Reliable 改为 Unreliable、对地图中 800 个静态可交互战利品容器启用 Net Dormancy。结果为每客户端服务器带宽下降 68%,服务器 tick 稳定在 60 Hz。
验证清单要求:GameMode 不含任何客户端逻辑且不被客户端 HUD 访问;所有 Server RPC 实现 _Validate 安全校验以防数据包注入;使用 DOREPLIFETIME_CONDITION 避免把私有数据(如库存)发给非拥有者;装饰性效果通过 Unreliable Multicast RPC 传输;大场景配置网络相关距离与 Net Dormancy。
反模式包括:在非拥有 Actor 上调用 Server RPC(由客户端对非其 PlayerController 拥有或控制的 Actor 调用,会静默失败);对高频 tick 事件使用 Reliable RPC(把高频开火或脚步 RPC 标为 Reliable,会在延迟抖动时造成类 TCP 的数据包队列);在客户端访问 AGameMode(在客户端 UI 控件中写 GetWorld()->GetAuthGameMode(),在非服务器机器上返回 nullptr)。
使用方式:资料以说明与代码示例形式给出,可作为开发 Unreal 网络功能的参考步骤与检查清单。适用场景为构建 Unreal 多人联机、Actor 复制或 RPC 的项目。限制:资料未提供安装命令、依赖版本、收费与平台信息,暂未提供。