comp->SetIsReplicated(true) 与 actor->SetReplicateMovement(true)
前情提要:#
最近在做联机下的MovingObject的同步,MovingObject包含一个或者多个StaticMeshComponent
因为是新手所以不太理解actor->SetReplicateMovement(true)
与comp->SetIsReplicated(true)
的区别,特此写文来说明研究过程
结论:#
actor->SetReplicateMovement(true)
会将Actor中的root component的Transform(position, rotation, scale)属性同步
comp->SetIsReplicated(true)
则是会将comp中所有的属性都拷贝过去,而不仅仅是component的Transform
也就是两者侧重点不同,一个是只关注actor的root component的Transform,一个是关注comp的各个属性。
探究过程:#
一开始按照函数名字解读以为是只要Actor内部有运动,其Transform都会被复制到各个客户端,但在探索联机MovingObject
的同步时,发现并不如所想的那样运行。
其主要原因是我现在在做的MovingObject
包含了两个StaticMeshComp
,运动的话类似于天平一上就会一下,于是我就没有把他们其中任意一个设置为RootComponent
,这也就是探究的开始...
由于较为简单,于是并没采用曲线而是直接手搓了一个在Tick中根据状态(一上一下/一下一上/停止)不断设置两个StaticMeshComp
的Location的办法,类似于:
void AMyActor::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
if (state == 一上一下)
{
// TODO...SetLocation
}
else if (state == 一下一上)
{
// TODO...SetLocation
}
else
{
//TODO
}
}
然后我就将state设置为了Replicated,并只设置了这个Actor的SetReplicateMovement(true)。结果发现并没有同步,也就是客户端最后呈现的位置与服务器上的位置有所偏差,于是就去看了对应的源码。
很容易得知,假如设置了SetReplicateMovement(true)
那么,简单地说其实就是把Actor中的bReplicateMovement
设置为true。
然后我们看如果为True会影响什么:
从这里我们可以看出来,其实Actor的Transform的同步是基于属性同步实现,其中关键的就是ReplicatedMovement
这个成员变量。
然后我们去看这个ReplicatedMovement
是怎么生成的,其实主要就是在AActor::GatherCurrentMovement
中
我们可以看出:
-
该函数在每次属性同步前都会被调用, 以生成相应的位置信息.
-
- bReplicateMovement 生成 ReplicatedMovement
- RootComponent->GetAttachParent() 生成 AttachmentReplication
-
判断是否开启物理, 物理的同步和没有物理的同步方式不一样
但是不管怎么样都会把RootComponent的Transform同步到ReplicatedMovement
中
接下来我们看回调函数OnRep_ReplicatedMovement
,也是比较简单,就是把同步过来的Transform设置给本地
因为PostNetReceiveLocationAndRotation
调用栈有点多就不赘述,最底层是用RootComponent->MoveComponent()
这个函数实现变换,值得注意的是,这个函数并没有实现平滑变换(插值外推等),仅仅是Set的作用
建议#
如果只有一个StaticMeshComponent并且为RootComponent,并且只想同步其Transform的话就不需要把StaticMeshComponent->SetIsReplicated(true),仅需要设置ReplicatedMovement=true
否则还是建议把所有的StaticMeshComponent都设置Replicated,并设置ReplicatedMovement=true
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
2020-01-09 开始寒假集训咯