NT-2.1|变量复制
大约 4 分钟
前情提要
解决流程
BP
C++
// .h
UFUNCTION(Server, Reliable)
void ServerSetHealth();
// .cpp
void AMyActor::ServerSetHealth_Implementation()
{
//spawn的代码
}
本章导读
BP|Multicast
C++|Multicast
// .h
UFUNCTION(Server, Reliable)
void ServerSetHealth();
// .cpp
void AMyActor::ServerSetHealth_Implementation()
{
MulticastFunction();
}
// 在 .h
UFUNCTION(NetMulticast, Reliable)
void MulticastFunction();
// 在 .cpp
void AMyActor::MulticastFunction_Implementation()
{
//实现移动逻辑。
}
变量复制
BP
变量|Replicated
开启复制后,变量右上角会出现两个泡泡。
变量|RepNotify
C++
注
C++:在服务器中更改 OnRep 变量时,仅当变量的值发生更改时,才会在客户端上触发 OnRep 行为。 服务器不会触发 OnRep,这意味着如果我们希望在服务器中执行 OnRep 行为,我们必须从服务器显式调用它。
蓝图:当我们在服务器中设置 OnRep 变量时,OnRep 行为将始终在服务器上触发(即使变量的值没有更改)。 但是,仅当 OnRep 的变量发生更改时,才会在客户端上触发 OnRep 行为。此外,无法显式调用由 OnRep 变量创建的 OnRep 函数。
C++|Replicated
// 在 .h 文件中声明 MyVariable 变量
UPROPERTY(Replicated)
float MyVariable;
// 在 .cpp 文件中设置变量同步
void AMyActor::GetLifetimeReplicatedProps(TArray< FLifetimeProperty > & OutLifetimeProps) const {
Super::GetLifetimeReplicatedProps(OutLifetimeProps);
DOREPLIFETIME(AMyActor, MyVariable);
}
C++|RepNotify|OnRep
// 在 .h 文件中声明 MyVariable 变量
UPROPERTY(ReplicatedUsing = OnRep_MyVariable)
float MyVariable;
// 在 .cpp 文件中设置变量同步,并声明 OnRep_MyVariable 函数
void AMyActor::GetLifetimeReplicatedProps(TArray< FLifetimeProperty > & OutLifetimeProps) const {
Super::GetLifetimeReplicatedProps(OutLifetimeProps);
DOREPLIFETIME_CONDITION_NOTIFY(AMyActor, MyVariable, COND_SkipOwner, REPNOTIFY_Always);
}
// OnRep_MyVariable 函数将在 MyVariable 发生变化时被调用
void AMyActor::OnRep_MyVariable() {
// 在这里添加在变量改变时执行的逻辑
UE_LOG(LogTemp, Warning, TEXT("MyVariable changed to: %f"), MyVariable);
}
C++|DOREPLIFETIME
变量的复制规则
DOREPLIFETIME:
DOREPLIFETIME(ClassName, VariableName);
这个宏用于声明一个类的变量需要在网络上进行复制。它会自动生成必要的复制代码。
DOREPLIFETIME_CONDITION:
DOREPLIFETIME_CONDITION(ClassName, VariableName, ReplicationCondition);
这个宏也用于声明一个类的变量需要在网络上进行复制,但允许添加一个额外的条件。ReplicationCondition
是一个用于判断是否进行复制的布尔表达式。只有在这个表达式为真时,复制才会发生。
示例:
DOREPLIFETIME_CONDITION(AMyActor, MyVariable, COND_SkipOwner);
条件标签 | 描述 |
---|---|
COND_InitialOnly | 仅在初始数据组尝试发送 |
COND_OwnerOnly | 仅发送至 actor 的所有者 |
COND_SkipOwner | 发送至除所有者之外的每个连接 |
COND_SimulatedOnly | 仅发送至模拟 actor |
COND_AutonomousOnly | 仅发送给自治 actor |
COND_SimulatedOrPhysics | 发送至模拟或 bRepPhysics actor |
COND_InitialOrOwner | 发送初始数据包,或者发送至 actor 所有者 |
COND_Custom | 没有特定条件,但需要通过 SetCustomIsActiveOverride 开启/关闭能力 |