【UEC++学习】UE网络 - Replication、RPC

【UEC++学习】UE网络 - Replication、RPCUE 的网络系统 Replication RPC ue5 的网络复制

1. UE网络架构

(1)UE的网络架构是SC(Server - Client)的模式,这种模式的优势:这种模式让所有客户端都在服务器端进行安全验证,这样可以有效的防止客户端上的作弊问题。
(2)Listen Server(等待加入的服务器):局域网上建的服务器,等待其他人的加入,即一个人是服务端,其他人则是客户端。Dedicated Server(专有服务器)。
(3)我们在客户端上操作的角色称为本地角色,同时服务器上也有一个角色称为远程角色。

GamePlay框架在SC架构上:
GameMode是只存在在服务端的,PlayerController_Server是存在在服务端的。
每启动一个游戏实例,都会生成对应的UI和GameInstance,因此每个客户端和服务端都存在自己独一无二的GameInstance、UI。

网络信息的传输方式
(1)Replication(网络复制):只能是单向的,从服务端复制到客户端
(2)RepNotify:更改属性时,执行网络通知函数
(3)RPC:方向是任意的

2. Replication

官方文档:多人游戏编程快速入门指南

2.1 Actor Replication

网络信息只能从服务端传递到客户端,而客户端想发送信息到服务端需要RPC。所有的Actor都有网络复制的能力。

类型:
(1)Actor Replication - Actor网络复制
(2)Property Replication - 属性网络复制
(3)Component Replication - Component网络复制

在C++中打开Replication

/ 在Actor类中直接设置为true */ // 开启网络复制 bReplicates = true; 

在蓝图中打开Replication

在这里插入图片描述

在C++中打开Replication

/ 在Actor类中直接设置为true */ // 开启网络复制 bReplicates = true; 

测试:如果不开启Replication,只在服务端上生成,客户端不生成。

我们将Number of Players调成2,并将Net Mode改为Play As Listen Server。

在这里插入图片描述

并在关卡蓝图中生成Actor,使其只在服务端中生成。

在这里插入图片描述

可以看到在服务端存在的物体,在客户端中并不存在,但是该物体在客户端有物理碰撞的检测,这是因为Character Movement Component是Replication,这样就导致客户端出现空气墙的阻挡。

在这里插入图片描述

在这里插入图片描述

2.2 Property Replication

在蓝图中打开Property Replication

在这里插入图片描述

在C++中打开Property Replication

/ 1. 在属性中定义Replicated */ UPROPERTY(Replicated) float Time = 100.f; / 2. 添加GetLifetimeReplicatedProps重写方法,并使用DOREPLIFETIME进行绑定 */ void ARPGTestCharacter::GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const { 
    Super::GetLifetimeReplicatedProps(OutLifetimeProps); DOREPLIFETIME(ARPGTestCharacter, Time); } 

只在服务器上设置,客户端上的属性就会通过Replication进行复制同步。

if(HasAuthority()) { 
    // 对需要Replication的属性进行设置 Time = 200; } 

2.3 RepNotify

在蓝图中打开RepNotify

在这里插入图片描述

RepNotify会自动生成一个函数,当属性发生改变时(即发生复制时),对于蓝图来说客户端和服务端都会执行一次这个函数。

在C++中打开RepNotify

/ 1. 定义为ReplicatedUsing,并添加通知的函数名 */ UPROPERTY(ReplicatedUsing = OnRep_Time) float Time = 100.f; / 2. 定义通知发生时的函数 */ // Rep_Notify的回调函数必须加上UFUNCTION() UFUNCTION() void OnRep_Time(); / 3. 添加GetLifetimeReplicatedProps重写方法,并使用DOREPLIFETIME进行绑定 */ void ARPGTestCharacter::GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const { 
    Super::GetLifetimeReplicatedProps(OutLifetimeProps); DOREPLIFETIME(ARPGTestCharacter, Time); } 

注意:如果是C++中的RepNotify,只会在客户端执行这个函数。

3. Owner

Owner是一个链条,最终会追溯到PlayerController,通过Connect连接到服务端。

在蓝图中指定Owner

在这里插入图片描述

在C++中指定Owner

/ 通过SpawnActor指定Owner */ AActor* SpawnActor( UClass* Class, FTransform const* Transform, const FActorSpawnParameters& SpawnParameters = FActorSpawnParameters()); // 在FActorSpawnParameters中指定Owner struct ENGINE_API FActorSpawnParameters { 
    FActorSpawnParameters(); FName Name; AActor* Template; / 指定Owner */ AActor* Owner; APawn* Instigator; class ULevel* OverrideLevel; } 
/ AActor中的SetOwner函数 */ virtual void SetOwner( AActor* NewOwner ); / AActor中的GetOwner函数 */ AActor* GetOwner() const; 
/ 在Controller中调用Possess和UnPossess函数,在内部调用PossessedBy,最终调用SetOwner */ void APawn::PossessedBy(AController* NewController) { 
    / 在PossessedBy中调用SetOwner */ SetOwner(NewController); // ...... } 

4. Actor Role

官方文档:Actor 的 Role 和 RemoteRole 属性

Authority:只存在于服务端,所有实例在服务端都有一个Authority。
Autonomous Proxy:相当于在客户端上的玩家,有自主权,但还是要通过服务器的Authority验证。
Simulated Proxy:每个客户端上,都存在其他客户端和一个服务器的实例,这个实例就是Simulated,因为不可能每帧都去进行同步,因此会有个间隔去进行同步,而Simulated模拟的就是这个插值。

5. RPC

官方文档:RPC

因为RPC是不可靠的,因此其不需要返回值,在蓝图中也只有Event才能设置RPC。

在蓝图中打开RPC

在这里插入图片描述

在C++中打开RPC

/ * 声明RPC模式会定义XXX_Implementation()函数 * 声明WithValidation会定义XXX_Validate()函数,用于数据判断,若为false则直接断开RPC */ // 多播执行 UFUNCTION(NetMulticast, Reliable) void MulticastExe(); // Server执行,WithValidation  UFUNCTION(Server, Reliable, WithValidation) void ServerExe(); // Server执行  UFUNCTION(Client, Unreliable) void ClientExe(); 

在官网中的表格可以找到Actor ownership和对应的Event设置的模式会产生对应的效果,实际情况我们可以通过设置进行调用:

在这里插入图片描述

6. 理论应用

6.1 如何区分Actor Role

主要通过Is Locally Controlled()Get Local Role()来进行判断。

在这里插入图片描述

6.2 在服务端获取客户端的Authority

因为GameMode只存在于服务端,则通过GameMode存储

在这里插入图片描述

今天的文章 【UEC++学习】UE网络 - Replication、RPC分享到此就结束了,感谢您的阅读。
编程小号
上一篇 2025-01-03 19:01
下一篇 2025-01-03 18:57

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/bian-cheng-ji-chu/100401.html