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.
Deiner Welt wird nichts hinzugefügt
Abschnitt betitelt „Deiner Welt wird nichts hinzugefügt“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.
Was es prüft
Abschnitt betitelt „Was es prüft“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.
RequestSerialization() in Start() — Warnung
Abschnitt betitelt „RequestSerialization() in Start() — Warnung“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.
Serialisieren ohne Besitzprüfung — Warnung
Abschnitt betitelt „Serialisieren ohne Besitzprüfung — Warnung“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.
Kein Sync-Modus deklariert — Hinweis
Abschnitt betitelt „Kein Sync-Modus deklariert — Hinweis“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.
Spieler-Events ohne isLocal — Warnung
Abschnitt betitelt „Spieler-Events ohne isLocal — Warnung“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.
Sicher, und wahrscheinlich
Abschnitt betitelt „Sicher, und wahrscheinlich“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.
Was es nicht tut
Abschnitt betitelt „Was es nicht tut“- 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.
