Quick answer: Mark the UPROPERTY with Replicated (or ReplicatedUsing), register it in GetLifetimeReplicatedProps, and ensure the actor has bReplicates = true in the constructor. Use a UFUNCTION OnRep handler if you want client-side change notifications.
You set a tag on the server. The client doesn’t see the change. The actor replicates other properties fine. GameplayTagContainer is a USTRUCT and follows normal replication rules — but it’s easy to skip a step.
The Symptom
Server-set GameplayTags don’t appear on clients. RPC calls work; other replicated properties update. Only the tag container is silent.
The Required Pattern
// Header
UCLASS()
class AMyActor : public AActor
{
GENERATED_BODY()
public:
AMyActor();
UPROPERTY(ReplicatedUsing=OnRep_Tags, BlueprintReadOnly)
FGameplayTagContainer Tags;
UFUNCTION()
void OnRep_Tags();
virtual void GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& Out) const override;
};
// Cpp
AMyActor::AMyActor()
{
bReplicates = true; // MUST
SetReplicateMovement(true); // optional, for transform
}
void AMyActor::GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& Out) const
{
Super::GetLifetimeReplicatedProps(Out);
DOREPLIFETIME(AMyActor, Tags);
}
void AMyActor::OnRep_Tags()
{
UE_LOG(LogTemp, Log, TEXT("Client saw tags update: %s"), *Tags.ToString());
}
Three things must all be true:
- Actor
bReplicates = true. - Property tagged Replicated or ReplicatedUsing.
- Registered in GetLifetimeReplicatedProps.
Mutating from the Server
The container only replicates when modified on the server (HasAuthority). Client-side AddTag/RemoveTag never propagates — the change exists only locally and is overwritten on the next server replication.
void AMyActor::ServerAddTag(const FGameplayTag& Tag)
{
if (!HasAuthority()) return;
Tags.AddTag(Tag);
OnRep_Tags(); // also fire locally on the server
}
Conditional Replication
To replicate to only some clients (owner, relevant), use COND parameters in DOREPLIFETIME:
DOREPLIFETIME_CONDITION(AMyActor, Tags, COND_OwnerOnly);
Verifying
Network Profiler (Window → Developer Tools → Network Profiler) records replicated properties per actor. Trigger a tag change on the server; the property should appear in the next replication batch with a non-zero size.
Or simply Print on the client’s OnRep_Tags. Should fire on every server-side change.
“bReplicates. Replicated. DOREPLIFETIME. OnRep for client reactions. Tags arrive.”
Related Issues
For multiplayer spawn replication, see spawner replication. For input modifier stuck, see input modifier.
Three switches. Tags propagate.