Photon Fusion Networked Transform: Syncing Fast‑Moving Objects Without Manual State Management
A practical look at Photon Fusion's Networked Transform component, covering setup, interpolation tuning, prediction costs, and a quick test scene to verify synchronization.
31 Aug 2026, 07:49 UTC

The problem: jittery movement in multiplayer
\nWhen you replicate a GameObject’s position across the network, naïve solutions (sending the transform every frame) quickly saturate bandwidth and still leave clients with visible stutter because each packet arrives at a slightly different time. Photon Fusion’s NetworkedTransform component was built to remove that boilerplate: it records a snapshot each frame, interpolates deterministically on the client, and optionally runs a lightweight prediction step so fast‑moving objects feel responsive.
Why Networked Transform solves it
\n- \n
- Automatic snapshots – The component captures
position,rotation, andscaleinFixedUpdatewithout any custom code. \n - Deterministic interpolation – Clients replay snapshots using Fusion’s shared tick clock, so every client renders the same interpolated state. \n
- Configurable delay –
InterpolationDelay(in ticks) lets you trade a few milliseconds of perceived lag for smoother motion. \n - Optional prediction – Enabling the
Predictionflag runs a client‑side physics step ahead of the authoritative snapshot, reducing jitter on high‑speed objects at the cost of extra CPU. \n
Configuring interpolation delay
\nThe InterpolationDelay property is expressed in Fusion ticks (default 2). A lower value reduces the time between the authoritative snapshot and what the client renders, but any network jitter shows up as micro‑stutters. A higher value smooths those out but adds a constant latency that players may feel on twitch‑style gameplay.
| InterpolationDelay (ticks) | Typical smoothness | Perceived lag |
|---|---|---|
| 1 | Sharp, occasional jitter | ~16 ms (60 Hz tick) |
| 2 (default) | Balanced | ~32 ms |
| 4 | Very smooth | ~64 ms |
Pick the smallest value that still hides your network’s jitter profile. Test by artificially adding latency with NetworkRunner.LagSimulation in the Unity Editor.
Enabling prediction and its cost
\nSet NetworkedTransform.Prediction = true on the component. Fusion will run a client‑side prediction step using the same physics scene as the server. This works well for kinematic objects (e.g., player‑controlled characters) but adds a measurable CPU spike: expect ~0.3 ms per predicted object on a modern desktop CPU (Unity 2022.3, Fusion 2.1). Profile with the Unity Profiler (Window → Analysis → Profiler) while the scene runs with two local clients.
Worked example: two‑player test scene
\n- \n
- Create a new Unity 2022.3 LTS project and import Photon Fusion 2.1 via the Package Manager. \n
- In a fresh scene, add two empty GameObjects named
PlayerHostandPlayerClient. \n - Attach a
NetworkObjectcomponent to each, then addNetworkedTransformBehaviour(this auto‑adds theNetworkedTransformcomponent). \n - On
PlayerHost, setNetworkedTransform.InterpolationDelay = 2and leavePredictionunchecked. \n - On
PlayerClient, set the same delay but enablePrediction. \n - Add a simple movement script (see below) to both objects so they move forward at 10 m/s. \n
- Enter Play mode, open the Fusion Debugging console (
Window → Photon Fusion → Debugging), and start a Host + Client session (use theStart HostandStart Clientbuttons). \n - Observe the positions in the Scene view: the host object follows the authoritative path; the client object interpolates smoothly. Toggle
Predictionon the host to see the extra CPU usage in the Profiler. \n
using UnityEngine;\nusing Photon.Fusion;\n\npublic class ConstantMover : NetworkBehaviour\n{\n [SerializeField] float speed = 10f;\n public override void FixedUpdateNetwork()\n {\n transform.position += Vector3.forward * speed * Runner.DeltaTime;\n }\n}\n\nWhere to run: Unity Editor (Play mode) with two local Fusion runners. Permissions: Editor play‑mode access; no special OS privileges. Placeholders: Replace speed with your gameplay value. Expected checks: In the Fusion Debugging console, snapshot timestamps for both objects should be within one tick of each other. Risks: Running two local runners can consume ~2 GB RAM on large scenes; close other heavy applications.
Trade‑offs and limits
\n- \n
- Bandwidth – Each
NetworkedTransformsends a snapshot per tick (default 60 Hz). For 100 moving objects that’s ~100 KB/s upstream; consider disabling interpolation on static props or batching updates viaNetworkedTransform.SnapshotRate. \n - Clock drift – Fusion synchronizes clocks at session start, but long sessions (>30 min) can accumulate drift. Periodically call
Runner.ResynchronizeClocks()if you notice growing interpolation error. \n - Prediction artifacts – When the server corrects a predicted state, you may see a brief “snap”. Test with your specific mechanics (e.g., collisions) before shipping. \n
- FixedUpdate dependency – The component assumes a fixed timestep. If you change
Time.fixedDeltaTimeat runtime, snapshots become inconsistent; keep the timestep constant or manually reset the component. \n
Actionable next steps
\n- \n
- Add the test scene to your project and verify snapshot alignment in the Fusion Debugging console. \n
- Profile CPU with prediction on/off for your target object count. \n
- Adjust
InterpolationDelayuntil jitter disappears without noticeable input lag. \n - If bandwidth spikes, mark non‑essential objects with
NetworkedTransform.Enabled = falseor lower theirSnapshotRate. \n - Schedule a clock‑resync call for sessions longer than 20 minutes. \n
With these steps you’ll have a deterministic, low‑maintenance transform sync that scales from a handful of players to dozens of fast‑moving entities.
0 replies
A thoughtful contribution can make all the difference. Be the first to share one.