【UE网络】虚幻网络系统
一. 单机游戏与网络游戏
1.1 单机游戏
1.2 网络游戏
- 构成的必要条件:终端用户、联网硬件环境、服务器、数据传输通信协议
- 借助服务器和通信协议,进行玩家交互
1.3 网络交互流程
二. 服务器与客户端
- 服务器端(Service)是响应请求(response),返回相应的资源数据
- 服务器最主要的是CPU(开发游戏引擎 - 游戏开发 - 引擎应用开发)
- 客户端(Client)是发送请求(request)与验证
- 提供本地服务,并收集玩家操作反馈给服务器
三. 虚幻网络构架
3.1 Listen - Server 体系结构
- UE4 使用标准的 Listen - Server 体系结构(L - S能够很好的规避游戏中作弊)
eg:客户端的操作,需要服务器进行检测,服务器允许后,客户端才可以操作(而不是客户端直接操作)
3.2 UE网络架构
- UE中主机(服务器)与客户端重合
- UE认定,创建房间的客户端同时具备服务器特性
- UE中支持单独进行服务器封包操作(这需要更新源码操作)
四. 角色身份
- 在UE网络框架中,Actor是促成网络同步的重要助推
4.1 网络信息传递的主要方式
- 复制Replication
- 信息从服务端同步到客户端(单向)
- Actor 及其派生类才有 Replication 的能力
- Replication 的三大类型:
- ① Actor Replication对象复制
- 服务端生成,客户端也跟着生成(在服务端生成一个 replicate 对象)
- 当前 Actor 的所有属性复制、组件复制、RPC的总开关
- ① Actor Replication对象复制
C++中开启:
bReplicates = true;
-
-
- ② Property Replication属性复制
-
C++中开启:
//属性前加 UPROPERTY(Replicated),VisibleAnywhere在蓝图中可视 UPROPERTY(Replicated,VisibleAnywhere) string Name = "张三"; //在.cpp文件 GetLifetimeReplicatedProps 函数中添加:DOREPLIFETIME(类名称,变量名),不需要声明该函数 //加头文件 #include "Net/UnrealNetwork.h" void ATestCPPActor::GetLifetimeReplicatedProps(TArray< FLifetimeProperty > & OutLifetimeProps) const { Super::GetLifetimeReplicatedProps(OutLifetimeProps); DOREPLIFETIME (ATestCPPActor, Name); }
-
-
- ③ Component Replication组件复制
-
- 复制通知 Rep_Notify
- 如果一个变量设置为Rep_Notify,当该变量发生复制时,服务端和收到该值的客户端都可以调用一个自定义的函数(C++版本仅在客户端调用函数)
C++中开启:
// 在AMyActor.cpp 文件的构造函数中,复制设置为true AMyActor::AMyActor() { SetRootComponent(CreateDefaultSubobject<USceneComponent>(TEXT("Root"))); //绑定一个空的根组件 bReplicates = true; } void AMyActor::Func() { //server if (HasAuthority()) { UE_LOG(LogTemp,Warning,TEXT("Server Name%s"),Name);} //client else{ UE_LOG(LogTemp,Warning,TEXT("Client Name%s"),Name);} } //在.cpp文件 GetLifetimeReplicatedProps 函数中添加:DOREPLIFETIME(类名称,变量名),不需要声明该函数 //加头文件 #include "Net/UnrealNetwork.h" void AMyActor::GetLifetimeReplicatedProps(TArray< FLifetimeProperty > & OutLifetimeProps) const { Super::GetLifetimeReplicatedProps(OutLifetimeProps); DOREPLIFETIME (AMyActor, Name); } // 在AMyActor.h 文件中定义变量 UPROPERTY(ReplicatedUsing = Func) string Name = "张三"; UFUNCTION() void Func();
- 远端调用RPC(灵活)
4.2 复制Replication 和 权威Authority
- 主机(服务器)通知客户端进行 Actor 创建,称之为 复制Replication
- 只有主机有权限对 Actor 进行修改或发布指令,称之为 权威Authority
远端调用 Remote Procedure Call
eg:假如客户端 A 想对客户端 B 发起攻击操作,但 A 对 B 无操作权限。A 应向主机发起攻击操作请求,由主机进行伤害传播。
4.3 Actor 的更新方式
- 属性更新
- 针对成员变量,由引擎推动
- 不消耗带宽,但会消耗CPU进行监视
- RPC(远端调用)
- 针对函数,由用户调用
4.4 UE中网络角色类型
五. 属性同步
5.1 Actor Replication 同步验证
- 场景中的 BP_Actor 同步到所有终端
- 客户端不能修改/生成 Actor(服务端勾选网络同步后,可以同步到所有终端)
- 同步 BP_Actor 的位置信息并移动
5.2 网络角色类型
- UE 网络框架将操控的 Pawn 划分为:Authority、Autonomous、Simulated
- Authority 权威
- 服务器端,所有角色均被标记为 Authority(服务器的绝对权威性)
- Actor 存在于服务器
- Autonomous 自主
- 操控来源于真人,在客户端操纵的角色为 Autonomous
- Simulated 模拟
- 其他角色则为Simulated,(远端)操控来源于服务器
- Authority 权威
5.3 角色类型标记属性
- 每个 Actor 中都存在2个属性(Role、RemoteRole),用来裁定当前 Actor 在服务器/客户端上的身份类型
- Role
- Get Local Role 节点:当前角色在本地端的身份类型
- Role 可以用来裁定当前角色是否在服务器,判断本地端是否为权威:
- Has Authority 节点(函数)
- Switch Has Authority 节点(宏)
-
- RemoteRole
- Get Remote Role 节点:当前角色在远端的身份类型
- Role 、RemoteRole 两个属性存在于 Actor 上,用于标记 Actor 在网络上的复制关系:
- Actor 的主控权在哪(拥有主控权方可进行复制)
- 当前 Actor 是否被复制
- 复制的模式(模拟 / 自主)
六. RPC远端调用
6.1 RPC概述
1. RPC:在本机上调用函数,但在其他机器上远程执行的函数
2. RPC 执行分3种形式:
- 服务端执行(Server)
- 在客户端调用,这个 Actor 必须拥有所有权
- 客户端执行(Client)
- 在服务端调用,Actor 所有权在该客户端上
- 所有终端执行(Multicast)
- 服务端调用,拥有 Actor 的服务端
6.2 RPC调用注意事项
- 必须从 Actor 上调用,Actor 必须被(面板勾选)复制
- 从服务器调用,客户端执行,则拥有该 Actor 的客户端才会执行 RPC
- 从客户端调用,服务器执行,客户端必须拥有调用 RPC 的 Actor
- 多播 RPC
- 从服务器调用,就在本地(服务器)和所有连上该服务器的客户端上执行
- 从客户端调用,就只在本地(客户端)上执行
- 客户端调用时,必须保证 Actor 具有操控权,(在服务器端可直接调用)
- 客户端广播时,必须经服务器再广播
- RPC 在蓝图中需借助自定义事件使用
- RPC 默认是不可靠的(为防止网络饱和,在频繁通讯时会出现丢失),需要根据情况开启Reliable,变为“可靠函数”
- RPC 调用时需注意调用 Actor 的从属关系和调用位置
6.3 RPC 调用情况
-END-
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本