NT-2.3.2|网络同步PushModel
大约 3 分钟
本章概要
ReplicatedUsing同步触发条件 蓝图和C++的区别
问题
1. 准备一个组件设置为可复制
2. 新建一个数组变量,并且使用ReplicatedUsing标记为可复制。
3. 增加1个RPC,标记为Server执行,用于添加内容到数组
4. 客户端/服务端上触发函数
5.增加1个RPC,标记为Server执行,用于修改数组里的内容。
6.运行
解决方案
1. 本地使用Tick监听数组
2. 使用临时变量传递一次,触发数组变量改变。
3. 用其他变量代替。
4. C++ PushModel
- **配置项目Config-DefaultEngine.ini **
[SystemSettings]
net.IsPushModelEnabled=1
net.PushModelSkipUndirtiedReplication=1
- Server.Target.cs中,bWithPushModel 也必须设置为 true。
public PushModelNetworkingServerTarget(TargetInfo Target) : base(Target)
{
Type = TargetType.Server;
bWithPushModel = true;
//...
}
- 引入必要的头文件和模块引用
#include "Net/UnrealNetwork.h"
#include "Net/Core/PushModel/PushModel.h"
NetCore 模块引用添加到我们的 build.cs
PrivateDependencyModuleNames.AddRange(new string[] { "NetCore" });
- 定义类和属性
定义属性,确保被标记为可复制,并使用 ReplicatedUsing
指定相应的通知函数。
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "YourClass.generated.h"
UCLASS()
class YOURPROJECT_API AYourClass : public AActor
{
GENERATED_BODY()
public:
AYourClass();
protected:
virtual void GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const override;
UPROPERTY(ReplicatedUsing = OnRep_Array)
TArray<AActor*> ReplicatedArray;
UFUNCTION()
void OnRep_Array();
UFUNCTION(Server, Reliable, WithValidation)
void ServerModifyArray(AActor* NewActor);
};
- 实现复制通知函数
实现 OnRep_Array
和 OnRep_ArrayTrigger
函数。
void AYourClass::OnRep_Array()
{
// 处理数组变化后的逻辑
UE_LOG(LogTemp, Warning, TEXT("Array has been replicated!"));
}
void AYourClass::GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const
{
Super::GetLifetimeReplicatedProps(OutLifetimeProps);
FDoRepLifetimeParams SharedParams;
SharedParams.bIsPushBased = true;
DOREPLIFETIME_WITH_PARAMS_FAST(AYourClass, ReplicatedArray, SharedParams);
}
- 手动标记属性为脏
在修改数组内容时,使用 PushModel
手动标记属性为脏。
void AYourClass::ServerModifyArray(AActor* NewActor)
{
if (HasAuthority())
{
// 修改数组内容
MyReplicatedArray.Add(NewActor);
// 手动标记数组属性为脏
MARK_PROPERTY_DIRTY_FROM_NAME(AYourClass, ReplicatedArray, this);
}
}