UE4学习笔记: Replication

Actors
客户端复制actor被spawn出来时, 只有Location和Rotation在PreBeginPlay()和PostBeginPlay()时是合法的
被复制的Actor只有在服务器关闭他们的复制通道时才被销毁
Actor的属性复制是可靠的. 只会从服务器往客户端同步

FReplicationFlags
属性 描述
bNetOwner
在目标机器上被PlayerController控制
bNetInitial
初始网络更新
bNetSimulated
Actor是 RemoteRole 模拟的.
bRepPhysics
Actor的ReplicatedMovement.bRepPhysics 为true

Components(组件)
多数componet是不复制的, 因为多数逻辑是在actor中完成的, 只需要同步compoent相关的调用即可, 除非component本身需要直接进行属性和事件的复制.
组件复制分两种:
  • 静态组件(actor创建时创建的)会在spawn actor时自动创建
  • 动态组件(服务器运行时创建的)会像actor复制一样创建和删除
AActorComponent::SetIsReplicated(true)

Variables(变量)
服务器的变量改动时会发送到客户端进行更新, 客户端的自行更改会被覆盖.

UPROPERTY(Replicated)

TArray<UAttributeSet*> SpawnedAttributes;

UPROPERTY(transient, ReplicatedUsing=OnRep_IsActive)

uint32 bIsActive:1;


函数调用
其实就是RPC. 
服务器调用客户端执行
UFUNCTION( Client );
void ClientRPCFunction();
客户端调用服务器执行
UFUNCTION( Server );
void ServerRPCFunction();
服务器调用, 服务器和客户端执行
UFUNCTION( NetMulticast );
void MulticastRPCFunction();
一些注意事项:
  • 必须从actor中调用
  • actor必须是复制的
  • client必须拥有相应的actor
  • 多播的函数如果是客户端调用的, 不会被同步到服务器
默认RPC是不可靠的, 除非加个标记:
UFUNCTION( Client, Reliable );
void ClientRPCFunction();
RPC函数可以加入校验函数:
UFUNCTION( Server, WithValidation );
void SomeRPCFunction( int32 AddHealth );
如果校验不没通过, 服务器会踢掉这个客户端
bool SomeRPCFunction _Validate( int32 AddHealth )
{
    If ( AddHealth > MAX_ADD_HEALTH )
    {
        return false;                       // This will disconnect the caller
    }
return true;                              // This will allow the RPC to be called
}

void SomeRPCFunction _Implementation( int32 AddHealth )
{
    Health += AddHealth;
}
其它
并不是所有的actor都会被同步的, 而与你”相关”的, 比如不在你视野范围内的就不需要同步
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值