Zum Inhalt springen

FOS Sync Doctor

Version 1.2.1 · benötigt FOS Essentials Core 1.1.0 oder neuer

Prüft die synchronisierten Verhalten deiner Welt auf die Fehler, die nie einen Fehler melden — jene, die man erst bemerkt, wenn jemand deiner Instanz beitritt und eine andere Welt sieht als alle anderen.

Kostenlos. Benötigt FOS Essentials Core 1.1.0.

Menü: FOS Essentials > FOS Sync Doctor > Audit.


Dieses Pack enthält ausschließlich Editor-Code. Keine Komponente, kein Prefab, kein Verhalten. Es liest deine Skripte und die Komponenten deiner Szene und berichtet; es läuft nie im Spiel und kostet zur Laufzeit nichts.

Deshalb wird es auch ohne Runtime-Assembly und ohne Prefabs-Ordner ausgeliefert, anders als jedes andere FOS-Pack: Es gäbe nichts hineinzulegen.


Ein Sync-Modus, der dem Skript widerspricht — Fehler

Abschnitt betitelt „Ein Sync-Modus, der dem Skript widerspricht — Fehler“

Der Modus, den ein Skript deklariert, ist nicht der, der läuft. Es läuft der Wert, der am UdonBehaviour in deiner Szene gespeichert ist, und beide laufen auseinander, sobald eine Komponente ersetzt, dupliziert oder wieder eingefügt wird. Nichts warnt dich: Der Inspektor zeigt weiterhin den deklarierten Modus.

Landet eine manuelle Synchronisierung als kontinuierliche gespeichert, überschreitet die Nutzlast die Grenze von etwa 200 Byte des kontinuierlichen Modus, der Encoder scheitert, VRChat versucht es endlos erneut, und nichts verlässt mehr den Rechner des Besitzers. Lokal funktioniert weiterhin alles, für alle anderen wirkt die Welt schlicht tot — ohne eine Fehlermeldung, die es erklärt.

Das ist der einzige Befund, den das Fenster reparieren kann. Fix stellt den deklarierten Modus wieder her; speichere danach die Szene, sonst geht die Korrektur verloren.

Synchronisierte Variablen ohne OnDeserialization — Fehler

Abschnitt betitelt „Synchronisierte Variablen ohne OnDeserialization — Fehler“

Der mit Abstand häufigste Fehler bei spät Hinzukommenden. Die Werte treffen ein, und nichts wendet sie an. Für die beigetretene Person bleibt die Welt in ihrem Anfangszustand — dauerhaft.

Ein Feld mit [FieldChangeCallback] wird nicht gemeldet: Der Callback feuert beim Deserialisieren, dieses Muster ist also bereits richtig.

VRChat dokumentiert, dass eine aus Start() angeforderte Serialisierung später Beitretende nicht erreicht. Sende sie aus einem Event oder aus OnPlayerJoined.

Manuelle Synchronisierung, die nie serialisiert — Warnung

Abschnitt betitelt „Manuelle Synchronisierung, die nie serialisiert — Warnung“

Manuelle Synchronisierung sendet nichts, bis du es verlangst. Ohne ein einziges RequestSerialization() sind die Variablen praktisch lokal.

Die Helfer des Core zählen als Serialisierung: Ein Skript, das FOSSync() oder FOSTakeOwnershipAndSync() aufruft, wird nicht gemeldet, da beide eine für dich anfordern.

Nur wer besitzt, kann serialisieren. Von allen anderen aufgerufen tut RequestSerialization() stillschweigend nichts — der verwirrendste Ausfall in Udon, weil lokal alles in Ordnung aussieht.

Kontinuierliche Synchronisierung mit Array oder Zeichenkette — Warnung

Abschnitt betitelt „Kontinuierliche Synchronisierung mit Array oder Zeichenkette — Warnung“

Kontinuierliche Synchronisierung ist auf rund 200 Byte je Verhalten begrenzt. Ein Feld variabler Länge überschreitet das ohne Warnung. Manuelle Synchronisierung trägt weit mehr.

Mehrere Verhalten auf einem Objekt, uneinig über den Modus — Fehler

Abschnitt betitelt „Mehrere Verhalten auf einem Objekt, uneinig über den Modus — Fehler“

VRChat wendet einen Sync-Modus je GameObject an. Setze zwei Udon-Verhalten auf dasselbe Objekt, und die übrigen erben den Modus, der sich durchsetzt — gleich, was ihr eigenes Skript deklariert. Eine Anzeige auf NoVariableSync neben einer Autorität auf Manual schwächt diese Autorität klammheimlich.

Das ist die Ursache hinter dem obigen Befund. Ohne sie reparierst du den gespeicherten Modus, speicherst, und er kommt beim nächsten Neukompilieren zurück, ohne dass irgendetwas sagt, woher.

Die Lösung ist nie ein zu ändernder Wert: Verschiebe das synchronisierende Verhalten auf sein eigenes GameObject.

Ohne [UdonBehaviourSyncMode] gilt standardmäßig Any, und der Modus bleibt im Inspektor änderbar, wo er versehentlich verstellt werden kann.

Ein gesendetes Event, das auf die lokale Person wirkt — Warnung

Abschnitt betitelt „Ein gesendetes Event, das auf die lokale Person wirkt — Warnung“

Der Fehler, dessen Verständnis am meisten Zeit kostet. Ein an alle Clients gesendetes Netzwerkereignis läuft auf jedem Client, und Networking.LocalPlayer bezeichnet dort jeweils eine andere Person. Ein Teleport für eine Person versetzt die gesamte Instanz.

OnPlayerTriggerEnter und Verwandte feuern auf jedem Client, für jede eintretende Person. Ohne die Prüfung löst eine fremde Person, die durch dein Volumen läuft, den Effekt auf deinem Rechner aus.

Ein Netzwerkereignis, dessen Name mit _ beginnt — Warnung

Abschnitt betitelt „Ein Netzwerkereignis, dessen Name mit _ beginnt — Warnung“

VRChat weigert sich, ein solches Ereignis aus der Ferne auszuführen. Der Aufruf geht hinaus, nichts geschieht, und nichts wird protokolliert.


Befunde gibt es in zwei Sorten, und das Fenster verwechselt sie nie.

Sichere Befunde stammen aus der Untersuchung der kompilierten Typen: welche Felder [UdonSynced] tragen, welcher Sync-Modus deklariert ist, ob OnDeserialization überschrieben wurde. Das sind Tatsachen.

Wahrscheinliche Befunde werden aus dem Text deiner Skripte abgeleitet, weil sich der Rumpf einer Methode nicht anders untersuchen lässt. „Dieses Skript ruft nie RequestSerialization auf” ist falsch, wenn ein anderes Skript es für dich tut. Solche Befunde tragen die Markierung probable und verdienen einen Blick, keine blinde Korrektur.

Kommentare und Zeichenketten werden vor jeder Suche entfernt: Ein Skript, das im Kommentar „hier keine Besitzprüfung” erklärt, wird also nicht für eines gehalten, das sie durchführt.

Ein Prüfwerkzeug, das dir nicht sagen kann, wie sehr du ihm trauen sollst, taugt wenig.


  • Es liest deine Skripte und genau eine Sache in deiner Szene: den an jeder Komponente gespeicherten Sync-Modus. Die Verdrahtung entgeht ihm — ein tadellos geschriebenes Verhalten, das auf das falsche Objekt zeigt, wirkt für es einwandfrei.
  • Es prüft weder Leistung noch Beleuchtung noch Quest-Budgets. VRWorldToolkit macht das gut, und kostenlos.
  • Es ändert von sich aus nichts. Jeder Befund ist ein Bericht, und die einzige Fix-Schaltfläche — beim widersprüchlichen Sync-Modus — handelt nur auf deinen Klick.

Standardmäßig werden die FOS-Packs selbst übersprungen: Du prüfst deine Welt, nicht diese Werkzeugreihe. Der Schalter existiert, falls du hineinsehen willst.