Skip to content

Sync Doctor — Changelog

All notable changes to this pack are recorded here.

The format follows Keep a Changelog and the pack follows Semantic Versioning.

The version below must always match the one declared in Editor/AssemblyInfo.cs — that is the version the FOS Hub shows, and the one the Hub compares against the installed Core.


  • The manual is now delivered in German, Spanish and French as well as English. The audit window already spoke four languages; the documentation that explains its findings did not.

Nothing yet.


  • Several Udon behaviours on one GameObject that disagree on the sync mode. VRChat applies a single mode per object, so the others inherit it whatever their own script declares — a display set to NoVariableSync next to an authority set to Manual quietly degrades that authority, and the only sign is a discreet inspector warning. This is the cause behind “the stored mode contradicts the script”: without it you repair the stored mode, save, and it returns at the next recompile with nothing to explain why. Reported as an error when one of the behaviours carries synchronised state, and it names every behaviour involved along with its declared mode.
  • A behaviour built on FOSBehaviour was reported as never serialising. The audit looked for RequestSerialization() by name, while the Core’s FOSSync() and FOSTakeOwnershipAndSync() call it on your behalf — so the recommended way of serialising in this line was flagged as the mistake of not serialising at all. Both now count, in that check and in the one watching for a serialisation requested from Start(), which missed them for the same reason and stayed silent when it should have warned.
  • The Fix button appeared on findings it could not fix. It showed on any finding pointing at a component in the scene, while only one of them carries a mode to reapply — clicking it elsewhere would have written the default mode, breaking the very thing the button claims to repair. Only the contradictory sync mode offers it now.

  • A component whose stored sync mode contradicts the one its script declares. What runs is the stored value, and the two drift apart when a component is replaced or duplicated — while the inspector goes on showing the declared mode. Manual data stored as continuous goes over the ~200 byte cap and the behaviour stops synchronising entirely, with no message. It is the only finding the window can repair, on a Fix button.

First release. Free. Requires FOS Essentials Core 1.1.0.

Audit window — FOS Essentials > FOS Sync Doctor > Audit

  • Synchronised variables with no OnDeserialization, the most common late-joiner bug. A field carrying [FieldChangeCallback] is not reported: that pattern already works.
  • RequestSerialization() called from Start(), which VRChat documents as not reaching players who join later.
  • Manual sync that never calls RequestSerialization(), so nothing is ever sent.
  • RequestSerialization() called with no ownership check nearby, where it silently does nothing for anyone who is not the owner.
  • Continuous sync carrying an array or a string, over the ~200 byte per-behaviour cap.
  • No [UdonBehaviourSyncMode] declared, reported as a note.

Scope mistakes — code written as if it ran on one machine

  • A network event broadcast to every client whose body acts on the local player. The local player is a different one on each machine, so the action hits everybody — the teleport meant for one person that moves the whole instance.
  • OnPlayerTriggerEnter and the other player events used without checking player.isLocal. They fire on every client, for every player entering.
  • SendCustomNetworkEvent targeting a method whose name starts with an underscore, which VRChat refuses to run remotely. The call leaves and nothing happens.

Documentation

  • Every finding carries a Documentation button opening the online guide directly at the section explaining that case.

Reliability

  • Findings are split between certain — read from the compiled types — and probable, deduced from the source text because a method body cannot be inspected otherwise. The window tags the probable ones rather than presenting every finding as a verdict.

Scope

  • The FOS packs and the SDK sample scripts are skipped by default; a toggle includes the FOS packs.
  • Every finding links to its script.
  • Interface translated into English, French, Spanish and German.
  • Editor code only. No component, no prefab, no runtime cost, nothing added to the world. The pack therefore ships without a Runtime assembly or a Prefabs folder.
  • The audit reads scripts, plus the sync mode stored on the components of the open scene. Wiring stays outside what it can see: a correct behaviour pointed at the wrong object still looks fine to it.