陕西省建设造价协会网站,网页升级访问永久你懂的,展厅策划方案,北京网站搭建报价1. UE网络架构
#xff08;1#xff09;UE的网络架构是SC#xff08;Server - Client#xff09;的模式#xff0c;这种模式的优势#xff1a;这种模式让所有客户端都在服务器端进行安全验证#xff0c;这样可以有效的防止客户端上的作弊问题。 #xff08;2#xff…1. UE网络架构
1UE的网络架构是SCServer - Client的模式这种模式的优势这种模式让所有客户端都在服务器端进行安全验证这样可以有效的防止客户端上的作弊问题。 2Listen Server等待加入的服务器局域网上建的服务器等待其他人的加入即一个人是服务端其他人则是客户端。Dedicated Server专有服务器。 3我们在客户端上操作的角色称为本地角色同时服务器上也有一个角色称为远程角色。
GamePlay框架在SC架构上 GameMode是只存在在服务端的PlayerController_Server是存在在服务端的。 每启动一个游戏实例都会生成对应的UI和GameInstance因此每个客户端和服务端都存在自己独一无二的GameInstance、UI。
网络信息的传输方式 1Replication网络复制只能是单向的从服务端复制到客户端 2RepNotify更改属性时执行网络通知函数 3RPC方向是任意的
2. Replication
官方文档多人游戏编程快速入门指南
2.1 Actor Replication
网络信息只能从服务端传递到客户端而客户端想发送信息到服务端需要RPC。所有的Actor都有网络复制的能力。
类型 1Actor Replication - Actor网络复制 2Property Replication - 属性网络复制 3Component 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(TArrayFLifetimeProperty 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(TArrayFLifetimeProperty 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存储