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_CONDITION and the ELifetimeCondition family).
  • Push-model dirty marking (MARK_PROPERTY_DIRTY_FROM_NAME and the rest of the push-model API).
  • Per-actor relevancy knobs (NetUpdateFrequency, bAlwaysRelevant, bNetUseOwnerRelevancy, NetCullDistanceSquared).
  • The dormancy state machine (SetNetDormancy, FlushNetDormancy, bNetDormant, NetDormancy).
  • FFastArraySerializer and FastArraySerializerItem.

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 bAutomaticallySendUpdates and CopyLocalStateNextFrame() on UFusionActorComponent, see Replicated Properties.
  • Relevancy and dormancy — use UFusionSpatialHashInterestComponent and the OnInterestEnter / OnInterestExit events, see Interest Management.
  • Delta-replicated arrays — migrate FFastArraySerializer-derived structs to FFusionNetworkedArray and wire PreRemove / PostAdd / PostChange callbacks via FFusionArrayHooks, 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.

Back to top