Quick answer: Set the replication condition to COND_None for state visible to all clients. Use COND_OwnerOnly only for owner-private values (loadout details, inventory).
Health bar over enemies updates for the owning player but not for spectators. Variable is replicated — just with the wrong scope condition.
The Symptom
RepNotify fires on owner. Other clients don’t see the change. Server logs show the change applied authoritatively.
The Fix
// C++
void ACharacter::GetLifetimeReplicatedProps(
TArray<FLifetimeProperty>& OutLifetimeProps) const {
Super::GetLifetimeReplicatedProps(OutLifetimeProps);
DOREPLIFETIME(ACharacter, Health); // COND_None implicit
DOREPLIFETIME_CONDITION(ACharacter, Inventory, COND_OwnerOnly);
}
// Blueprint
// Variable Details → Replication: Replicated (or RepNotify)
// Replication Condition: None (for visible-to-all)
For Blueprint variables, the condition dropdown sits next to the Replication checkbox. Default is None — if you changed it, change it back unless you really want owner-only.
Common Wrong Choice
Players ticking OwnerOnly as a security thought. But health is publicly visible by gameplay; replicating only to owner just hides it from teammates’ UI. Use server-side validation for security, not client-side replication scope.
Verifying
Two-client PIE. Server damages enemy. Both clients see health update.
“Public state: COND_None. Private state: COND_OwnerOnly. RPC for events.”
Related Issues
For Anim BP state alias, see state alias. For Niagara collision event, see collision event.
Right scope. State propagates.