问答中心分类: 软件UE4 如何沿路径复制物体
美梦成真美梦成真 贡献者 提问于 4周 以前

UE4中物体位置同步的实现是靠属性同步, 如下:
在同步前, 需要产生需要同步的位置信息, 稍后深入并重写是否需要位置同步ReplicatedMovement只有 bReplicateMovement为True时 才进行同步
AttachmentReplication在 根组件存在并且根组件不同步 的时候同步
这里强调下AttachmentReplication的同步条件, 这样处理有坑, 之后补充
如果需要同步, 那么然后物体ReplicatedMovement 或 AttachmentReplication会被同步到客户端, 并调用相应的OnRep函数执行对应的逻辑
至此, 整个同步流程闭环.
代码细节
void AActor::GatherCurrentMovement()
1. 该函数在每次同步前都需要调用, 产生相应的位置信息这里的产生条件是bReplicateMovement 或者 RootComponent->GetAttachParent()前者为了生成 ReplicatedMovement, 后者为了生成 AttachmentReplication
2. 判断是否开启物理, 物理的同步和没有物理的同步方式不一样
这里判断且只判断根组件, 一般来说开启Actor同步的时候, 组件的相关信息并不会同步(勾取同步除外), Actor的位置信息同步, 本质上就是Actor根组件的位置同步
3. 物理同步相关可以看到物理同步会同步位置旋转速度和是否休眠同时注意在Welded时, 不会进行物理同步(然而并没有接触过)
4. 没有物理的情况下, 会走两种情况, 有没有父组件
有, 生成AttachementReplication, 这里同步位置, 旋转, 缩放, AttachComponent和SocketName
没有, 生成ReplicatedMovement, 这里同步位置, 旋转, 速度
注 :没有缩放, 即如果没有附加, Actor的缩放默认不会同步的
问题:但生成时候的Actor的缩放可能是会同步的(未深入)而SpawnActor(ActorClass, ActorTransform)生成的Actor好像服务端都不会带上缩放(好像是的)这里主要强调, 有时候会碰到服务器有物体生成时给的缩放。