Quick answer: Check bReplicates = true, that the actor was spawned on the server, that the client is within NetCullDistanceSquared, and that the ReplicatedUsing/Replicated UPROPERTYs and GetLifetimeReplicatedProps include your variables. Use showdebug net to diagnose what is actually replicating.

Here is how to fix Unreal actor replication not working. You set up a multiplayer game with listen server. You spawn an AEnemy on the server. On the server, you see it. On the client, nothing. Or you replicate a Health value, damage it on the server, and the client’s HP bar does not change. Unreal’s replication is powerful but has many layers — actor replication, property replication, relevancy, dormancy — any of which can silently block updates.

The Symptom

Something visible on the server is not on the client. Actors, property changes, movement — any of these can fail to replicate. The game does not error out; it just looks “desynchronized.” Clients may have correct logic for their own actors but see wrong state for others.

What Causes This

bReplicates is false. The actor replication master switch. In C++ constructor, bReplicates = true. In Blueprint class defaults, Replicates checkbox. Without it, the server never sends this actor to any client.

Spawned on client. SpawnActor on a client only creates a local-only actor. Never a replicated one. Only the server can spawn replicated actors. Clients that need the actor should receive it from the server.

Property not marked Replicated. For variables to replicate, they need UPROPERTY(Replicated) or UPROPERTY(ReplicatedUsing=OnRep_Foo), and must be listed in GetLifetimeReplicatedProps. Missing either of these means the server changes the value locally but clients never see.

Relevancy culling. Replicated actors beyond NetCullDistanceSquared from any client are not replicated to that client, to save bandwidth. Default is ~15,000 units (150 m). Actors in a distant part of the level are silently excluded.

Dormancy. An actor marked as Dormant (NetDormancy != DORM_Awake) does not replicate until it wakes up. Useful for static world state but breaks dynamic updates until you call FlushNetDormancy.

Component not replicated. Child UActorComponent with replicated properties needs SetIsReplicated(true) in the owning actor’s constructor. Actor replicates, but component’s properties do not, so the variable never syncs.

The Fix

Step 1: Enable replication on the actor.

// MyActor.cpp
AMyActor::AMyActor()
{
    PrimaryActorTick.bCanEverTick = true;
    bReplicates = true;
    bAlwaysRelevant = false; // default, usually fine
}

For an actor that should always replicate (game state, session manager), set bAlwaysRelevant = true. Do not abuse this — it defeats relevancy culling and sends the actor to every client always. Reserved for small actors that matter globally.

Step 2: Mark replicated properties and register in GetLifetimeReplicatedProps.

// MyActor.h
UPROPERTY(ReplicatedUsing = OnRep_Health)
float Health;

UFUNCTION()
void OnRep_Health();

virtual void GetLifetimeReplicatedProps(
    TArray<FLifetimeProperty>& OutLifetimeProps) const override;

// MyActor.cpp
#include "Net/UnrealNetwork.h"

void AMyActor::GetLifetimeReplicatedProps(
    TArray<FLifetimeProperty>& OutLifetimeProps) const
{
    Super::GetLifetimeReplicatedProps(OutLifetimeProps);

    DOREPLIFETIME(AMyActor, Health);
}

void AMyActor::OnRep_Health()
{
    // React to health change on clients
    UpdateHealthBar();
}

DOREPLIFETIME enrolls the property in replication. OnRep_ functions fire on clients when the server updates the property. Without GetLifetimeReplicatedProps the ReplicatedUsing has no effect.

Step 3: Spawn on server only.

void AGameMode::SpawnEnemy(FVector Location)
{
    if (HasAuthority())
    {
        GetWorld()->SpawnActor<AEnemy>(
            EnemyClass, Location, FRotator::ZeroRotator);
    }
}

HasAuthority() returns true on the server. On clients, it returns false and the spawn is skipped. If you need client-local effects (muzzle flash, particle), spawn those separately on the client without replication.

Step 4: Use showdebug net for diagnostics. In a running multiplayer game, open console and type:

showdebug net
net showrelevantactors
net contentions

The HUD shows replicated actors, relevancy state, and bandwidth usage. If your actor is not in the relevant list, it is being culled. If it is there but client still does not see it, replication is fine but something client-side is wrong.

Replicating Components

For replicated properties on a UActorComponent:

// In owning actor constructor
MyComponent = CreateDefaultSubobject<UMyComponent>(TEXT("MyComp"));
MyComponent->SetIsReplicated(true);

// In UMyComponent.cpp
UPROPERTY(Replicated)
float CoolValue;

void UMyComponent::GetLifetimeReplicatedProps(
    TArray<FLifetimeProperty>& OutLifetimeProps) const
{
    Super::GetLifetimeReplicatedProps(OutLifetimeProps);
    DOREPLIFETIME(UMyComponent, CoolValue);
}

Both levels — actor and component — must opt in to replication. Missing the component-side SetIsReplicated is one of the most common subtle bugs.

Dormancy

If your actor uses NetDormancy = DORM_DormantAll to save bandwidth (common on static world actors), it stops replicating until woken. When you modify a replicated property, wake it:

MyReplicatedProperty = NewValue;
FlushNetDormancy();

Without FlushNetDormancy, the change is buffered but never sent.

Blueprint Replication

In Blueprint, open Class Defaults and check Replicates. For variables, select the variable in My Blueprint, click the eye icon in the Details panel, and set Replication to “Replicated” or “RepNotify.” RepNotify auto-creates an OnRep function.

“Replication has three switches: actor, property, and relevancy. Missing any one and the client sees nothing.”

Related Issues

For ability system replication, see Unreal GameplayAbility Not Activating. For testing multiplayer, Testing Cross-Platform Multiplayer Games covers related debugging approaches.

bReplicates, Replicated property, GetLifetimeReplicatedProps. Three steps to every replicated variable.