None. By default none of the Subsystems are replicated. But you can replicate them.
If you want to replicate subsystems you have to make them dependent on the Class that shares the same lifetime and have that Actor implementing these methods. It works even if the Subsystem wasn’t created by the Replicating Actor but by the time it’s replicating that Actor Reference must be set, otherwise it won’t work. A good example would be having a WorldSubsystem and implementing a AGameStateBase that implements that replication.
virtual bool ReplicateSubobjects(class UActorChannel *Channel, class FOutBunch *Bunch, FReplicationFlags *RepFlags) override;
virtual void GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const override;
And your subsystem implementing these:
virtual void GetLifetimeReplicatedProps(TArray< FLifetimeProperty > & OutLifetimeProps) const override;
virtual bool IsSupportedForNetworking() const override { return true; }
virtual bool ReplicateSubobjects(class UActorChannel *Channel, class FOutBunch *Bunch, FReplicationFlags *RepFlags) override;
Having that, in our AGameState we would have:
bool AMyGameState::ReplicateSubobjects(class UActorChannel* Channel, class FOutBunch* Bunch, FReplicationFlags* RepFlags)
{
bool WroteSomething = Super::ReplicateSubobjects(Channel, Bunch, RepFlags);
if (MySubsystem)
{
WroteSomething |= Channel->ReplicateSubobject(MySubsystem, *Bunch, *RepFlags);
}
return WroteSomething;
}
And then in our subsystem:
bool UMySubsystem::ReplicateSubobjects(UActorChannel* Channel, FOutBunch* Bunch, FReplicationFlags* RepFlags)
{
return false;
}
void UMySubsystem::GetLifetimeReplicatedProps(TArray< class FLifetimeProperty >& OutLifetimeProps) const
{
Super::GetLifetimeReplicatedProps(OutLifetimeProps);
DOREPLIFETIME(UMySubsystem, Var);
}