一.服务器中的GamePlay
服务器端是权威UE ,计算关键的东西。
客户端是表现,可以渲染关键信息的附带逻辑和效果。
其实是一套代码跑出来的,只是同步的信息点不同。服务器应该是有个完整的主机游戏。
UE 的 Server 是 Authoritative(权威方),决定血量、位置合法性。Client 负责插值、特效、输入预测反馈。并且确实是一套 Project 编译出来的,通过 HasAuthority() 和 GetNetMode() 走不同分支。
-
在 UE 的
Listen Server模式下,服务器确实跑着完整渲染(是一个完整的游戏客户端同时兼任服务器)。 -
在 UE 的
Dedicated Server(专用服务器)模式下 ,服务器没有显卡渲染,只有逻辑,不叫"完整主机游戏",更准确叫 "完整的 World State 副本"。

记住这个图,GameMode 是服务端独有,客户端没有的。
GameState都有一个且双端共有。PlayerState,Pawn 是都有所有的且共享的。
{Pawn 是都有所有的且共享的" ------ 准确说,每个客户端只知道自己控制的 Pawn 和已被复制到自己的其他 Pawn。服务器上所有 Pawn 都会复制给相关客户端,但服务器不主动把无关 Pawn 同步给不相关的客户端(相关性裁剪)}
服务器有所有的PlayerController,但是客户端只有自己的PlayerController
UMG,AHUD是客户端才有的。
二.服务器,客户端生成区别
| 生成方式 | 服务器 | 客户端 |
|---|---|---|
| SpawnActor | 直接生成,拥有 Authority | 若生成 Replicated Actor,需通过 RPC 请求服务器生成(或由服务器主动生成后同步下来) |
| 组件激活 | 组件 Tick 正常 | 部分组件(如 Movement Component)只在本地模拟,服务器不发 Tick |
| BeginPlay | 先于客户端执行(网络复制初始化前) | 在收到 Actor 复制并创建后执行,通常晚于服务器 |
三.状态同步
RPC,属性同步
1.属性同步时轮询的,属性同步本身有可靠性保证 :Reliable 的复制属性是保证送达的。如果在它轮询的时间返回到原来的结果,就相当于没有变。
只有当值发生改变且网络更新到来时才发送。
一般是服务器端向客户端,单向的。
2.RPC
1.分为 可靠(Reliable) 和 非可靠(Unreliable)。总记错为可信任和不可信任的
可信任的是一直发,发到你收到为止。带宽有限,节省着用。
不可信任的是发了,收不收得到,随缘不太受影像。适合不太重要的瞬态事件。
2.RPC方向
客户端向服务器端发送,这个我觉得是它比较大的存在意义。
服务器也可以向客户端调用。
RPC 方向:Client -> Server (需在客户端拥有或已在服务器上的 Actor 调用) 和 Server -> Client(需指定目标客户端)
四.预测 乐观预测
客户端本地预测移动/技能,不等服务器确认就表现结果(乐观预测)。
服务器收到输入后进行权威校正,若不一致则回滚或平滑修正(如 CharacterMovementComponent 的 ClientAdjustPosition)。