当前位置:首页 >> 跨学科知识体系 >> 【UEC++学习】UE网络 - Replication、RPC,太平洋二手手机论坛

【UEC++学习】UE网络 - Replication、RPC,太平洋二手手机论坛

cpugpu芯片开发光刻机 跨学科知识体系 1
文件名:【UEC++学习】UE网络 - Replication、RPC,太平洋二手手机论坛 【UEC++学习】UE网络 - Replication、RPC 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中指定Ownerstruct ENGINE_API FActorSpawnParameters{FActorSpawnParameters();FName Name;AActor* Template;/** 指定Owner */AActor* Owner;APawn*Instigator;classULevel* 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存储

协助本站SEO优化一下,谢谢!
关键词不能为空
同类推荐
«    2025年12月    »
1234567
891011121314
15161718192021
22232425262728
293031
控制面板
您好,欢迎到访网站!
  查看权限
网站分类
搜索
最新留言
文章归档
网站收藏
友情链接