UProjectileMovementComponent是UE中的抛体组件,可以用来仿真抛体运动,比如子弹,手榴弹,甚至是带有动力和追踪功能的导箭。但是UProjectileMovementComponent默认情况下仅仅本地有效,没有对网络进行Transform同步。
如果大家使用过这个组件,会发现在联网游戏中客户端和服务器的对象会出现位置不一致的情况,还有可能会出现对象跳动的现象,这些都是没有同步的表现,需要我们进行处理。
Actor的同步
在研究抛体组件同步之前,先来看看Actor是如何进行Transform同步的。
Actor的Transform实际上是根组件的Transform,因此对Actor的同步实际上就是对根组件的同步。
在客户端和服务器的连接后,会在连接的Socket上面建立一个个Channel,服务器上面的每一个对象都对应着一个ActorChannel,通过这个Channel,客户端和服务器的Actor建立通信通道,然后会进行数据同步和RPC调用,以及发起属性通知。
在Actor中,有一个标记bReplicateMovement被用来标记Actor是否同步,这个属性在蓝图的属性面板上面也有,如果标记为True,那么会进行相关的同步操作。
/**
* If true, replicate movement/location related properties.
* Actor must also be set to replicate.
* @see SetReplicates()
* @see https://docs.unrealengine.com/latest/INT/Gameplay/Networking/Replication/
*/
UPROPERTY(ReplicatedUsing=OnRep_ReplicateMovement, Category=Replication, EditDefaultsOnly)
uint8 bReplicateMovement:1;
Actor的Transform属性是通过一个特殊的结构体ReplicatedMovement来进行传递的,里面包含了相关的需要同步的属性,在ReplicatedMovement中的属性值发生改变的时候,会调用OnRep_ReplicatedMovement进行事件通知。
/** Used for replication of our RootComponent's position