造价员建设部网站,澄海手工外发加工网,惠州网站建设领头羊,合肥住房和建设厅网站首页本文参考https://zhuanlan.zhihu.com/p/640723352
准备工作
先准备一个勾选了复制的Actor#xff0c;然后在游戏开始时Spawn这个Actor
源码过程详解
发送属性同步
在NetDriver的TickFlush中发送属性同步的数据 1、ServerReplicateActors_BuildConsiderList 去找到所有需…本文参考https://zhuanlan.zhihu.com/p/640723352
准备工作
先准备一个勾选了复制的Actor然后在游戏开始时Spawn这个Actor
源码过程详解
发送属性同步
在NetDriver的TickFlush中发送属性同步的数据 1、ServerReplicateActors_BuildConsiderList 去找到所有需要属性同步的Actor并根据一些规则过滤掉一部分 2、ServerReplicateActors_PrioritizeActors 按照优先级对Actor进行排序不可靠的RPC也会被添加到需要发送的Actor数组末尾 3、ServerReplicateActors_ProcessPrioritizedActors 遍历每个需要发送的Actor 这里就可以找到我们的Actor 因为是第一次属性同步的数据所以这个Actor还没有Channel就会走到这里的创建Channel的逻辑 Channel就是通道每个网络复制的Actor都有一个服务端通过Channel将属性同步的数据发送到客户端 然后走到Channel-ReplicateActor()去执行这个通道的属性同步的操作 第一次属性同步会走到PackageMapClient类的SerializeNewActor这里的Connection就是客户端连接。 PackageMap每个Server和Client都会有一个该对象负责Actor和NetworkGUID的双向映射以及序列化一个Object。 然后走到SerializeObject 调用InternalWriteObject将NetGUID写入到Bunch中如果有PathName也会一起写入到Bunch中 NetGUID是一个结构体是网络复制Actor的唯一标识符用于复制时判断是否为相同的Actor如果有PathName就根据PathName判断没有PathName就根据Value判断PathName就是Actor的路径 编号 ArchetypeActor的CDO信息 ActorLevelActor所属关卡同步接受时是根据Level来找Actor的 Location、Scale、Velocity、Rotation这几个Actor属性 无论在服务器还是客户端CDO的路径是固定的只和资源路径有关与World无关。 比如在Game目录下创建了一个蓝图类那么它的CDO路径为/Game/TestActor.Default__TestActor_C 如果是C类那路径更加毫无疑问是一致的。 我们序列化CDO只要序列化其路径即可而且UE把所有UObject的网络同步都交给UPackageMapClient统一管理CDO也有NetworkGUID只有第一次同步时需要同步路径后面都同步NetworkGUID我们先都考虑第一次同步情况。 具体逻辑通过ExportNetGUID函数实现它会写入NetworGUID, path对应关系客户端收到后能在本地也建立起这个关系。如果Object有Outer也要对Outer执行同样操作把Outer关系也发送给客户端。 通过ExportNetGUID生产的序列化数据后续会被写入bunch前部相对于把Object和GUID的映射先告诉客户端客户端在处理后续Bunch时碰到对应NetworkGUID就知道是哪个Object了。
匿名函数ConditionallySerializeQuantizedVector将Location、Rotation等属性序列化到Bunch中 然后去发送属性同步Packet
接收属性同步
堆栈 1、是Actor的第一次属性同步所以接收时客户端还没有这个Actor 也是这六个属性 SerializeObject去序列化Actor数据到Archetype 读取到ActorLevel、Location、Rotation等信息 如果Actor为空Archetype(CDO)不为空就去生成Actor并附带位置、旋转、所在关卡等信息 如果Actor生成成功再去添加速度、缩放属性 去客户端注册这个Actor也就是去ObjectLookup数组中添加这个Actor下一次再有属性同步数据时就可以找到这个Actor了 如果是新生成的Actor执行PostNetInit()去执行Actor的BeginPlay 至此一个Actor的第一次属性复制的流程结束