Compatibility with Built-in Netcode
UPROPERTY Specifiers
Fusion piggybacks on Unreal's UPROPERTY reflection. UFusionTypeLookup::ShouldAddProperty inspects the standard CPF_Net, CPF_RepNotify, and CPF_RepSkip property flags, so the same three specifiers that drive built-in replication — Replicated, ReplicatedUsing, and NotReplicated — drive Fusion replication too. Other UPROPERTY specifiers (Transient, SaveGame, EditAnywhere, BlueprintReadWrite, etc.) carry over unchanged because they have nothing to do with replication.
C++
UCLASS()
class AMyActor : public AActor
{
GENERATED_BODY()
UPROPERTY(Replicated)
int32 Score;
UPROPERTY(ReplicatedUsing=OnRep_Health)
float Health;
UPROPERTY(NotReplicated)
int32 LocalDebugCounter;
UFUNCTION()
void OnRep_Health();
};
FString and FName are opt-in. Even when marked Replicated, FString and FName properties are skipped by default. The descriptor must be built with EFusionBuildStructOptions::AddStringProperties and/or EFusionBuildStructOptions::AddNameProperties for those types to flow through. Strings carry size and allocation cost on the wire — the opt-in is intentional. See C++ Integration for the descriptor-build flags.
Unsupported Built-in Netcode Mechanisms
The following Unreal built-in netcode mechanisms are not consulted by Fusion's replication path. Setting any of them has no effect; do not rely on them:
COND_*lifetime conditions (DOREPLIFETIME_CONDITIONand theELifetimeConditionfamily).- Push-model dirty marking (
MARK_PROPERTY_DIRTY_FROM_NAMEand the rest of the push-model API). - Per-actor relevancy knobs (
NetUpdateFrequency,bAlwaysRelevant,bNetUseOwnerRelevancy,NetCullDistanceSquared). - The dormancy state machine (
SetNetDormancy,FlushNetDormancy,bNetDormant,NetDormancy). FFastArraySerializerandFastArraySerializerItem.
The reason is structural: UFusionNetDriver::TickFlush and TickDispatch have empty bodies. Fusion drives its send loop from its own tick, not from the stock Unreal polling path that consults the actor-level knobs and per-property condition flags above. Inside the plugin, GetLifetimeReplicatedProps is overridden only by UFusionPhysicsReplicationComponent for its own state — nothing else in the plugin participates in the stock replication pipeline.
Each unsupported idiom has a Fusion equivalent:
- Owner-only / initial-only / simulated-only reads — gate on the client side using ownership state from Ownership or interest events on
UFusionActorComponent.
- Send cadence — use
bAutomaticallySendUpdatesandCopyLocalStateNextFrame()onUFusionActorComponent, see Replicated Properties.
- Relevancy and dormancy — use
UFusionSpatialHashInterestComponentand theOnInterestEnter/OnInterestExitevents, see Interest Management.
- Delta-replicated arrays — migrate
FFastArraySerializer-derived structs toFFusionNetworkedArrayand wirePreRemove/PostAdd/PostChangecallbacks viaFFusionArrayHooks, see Replicated Properties.
What Carries Over
UFusionNetDriver::ProcessRemoteFunction inspects the FUNC_NetMulticast, FUNC_NetClient, and FUNC_NetServer function flags and routes each call through an EFusionRPCTarget. The UFUNCTION(Server), UFUNCTION(Client), and UFUNCTION(NetMulticast) markers carry over for dispatch direction, although the meaning of "server" is "object owner" under shared authority — see RPC Basics for the routing table and delivery guarantees.
OnRep_* functions on ReplicatedUsing properties are resolved and invoked by UFusionTypeDescriptor. RepNotify carries over unchanged from the developer's perspective, with the one Fusion-specific difference that the notification fires on the authority too — see Replicated Properties for the authority-side OnRep behavior.
C++
UFUNCTION(Server, Reliable)
void Server_RequestFire();
The Reliable flag is an Unreal-side annotation. Fusion does not inspect it — instead, Fusion applies its own per-(caller, target) reliable-and-ordered guarantee from the FusionCore transport layer, as described in RPC Basics. Marking a UFUNCTION Reliable or Unreliable does not change Fusion's delivery semantics.
UFusionNetDriver::ShouldReplicateFunction returns true unconditionally. Every Server, Client, or NetMulticast UFUNCTION call is sent over Fusion — even on actors that have no UFusionActorComponent. Guard call sites accordingly; a stray Server RPC on a non-networked actor silently goes through FusionCore with no warning.
AActor::SetReplicates and bReplicates are not the gating flag under Fusion. Replication is opt-in via UFusionActorComponent registration on the actor, not via the stock UE bReplicates bit. An actor with bReplicates = true but no UFusionActorComponent is not replicated by Fusion. An actor with UFusionActorComponent is replicated regardless of the bReplicates value — although setting bReplicates = true remains good practice for the standard Unreal RPC machinery the plugin still routes through.