Aller au contenu

FOS Sync Doctor

Version 1.2.1 · exige FOS Essentials Core 1.1.0 ou plus récent

Passe en revue les comportements synchronisés de votre monde à la recherche des erreurs qui ne lèvent jamais d’erreur — celles qu’on ne découvre qu’au moment où un joueur rejoint votre instance et voit un monde différent de tous les autres.

Gratuit. Exige FOS Essentials Core 1.1.0.

Menu : FOS Essentials > FOS Sync Doctor > Audit.


Ce pack ne contient que du code éditeur. Aucun composant, aucun prefab, aucun comportement. Il lit vos scripts et les composants de votre scène, et rapporte ; il ne tourne jamais en jeu et ne coûte rien à l’exécution.

C’est aussi pourquoi il est livré sans assembly Runtime ni dossier Prefabs, contrairement à tous les autres packs FOS : il n’y aurait rien à y mettre.


Un mode de synchro qui contredit le script — erreur

Section intitulée « Un mode de synchro qui contredit le script — erreur »

Le mode déclaré par un script n’est pas celui qui s’exécute. Ce qui s’exécute, c’est la valeur enregistrée sur l’UdonBehaviour dans votre scène, et les deux divergent dès qu’un composant est remplacé, dupliqué ou recollé. Rien ne vous prévient : l’inspecteur continue d’afficher le mode déclaré.

Quand une synchro manuelle se retrouve enregistrée en continue, la charge dépasse le plafond d’environ 200 octets du mode continu, l’encodeur échoue, VRChat réessaie indéfiniment, et plus rien ne quitte la machine du propriétaire. Tout continue de fonctionner localement : le monde paraît simplement mort à tous les autres, sans la moindre erreur pour l’expliquer.

C’est le seul constat que la fenêtre sait réparer. Fix remet le mode déclaré ; sauvegardez la scène ensuite, sans quoi la correction est perdue.

Des variables synchronisées sans OnDeserialization — erreur

Section intitulée « Des variables synchronisées sans OnDeserialization — erreur »

Le bug d’arrivant tardif le plus fréquent de tous. Les valeurs arrivent, et rien ne les applique. Pour le joueur qui vient de rejoindre, le monde reste dans son état initial — définitivement.

Un champ portant [FieldChangeCallback] n’est pas signalé : le rappel se déclenche à la désérialisation, ce motif est donc déjà correct.

RequestSerialization() dans Start() — avertissement

Section intitulée « RequestSerialization() dans Start() — avertissement »

VRChat documente qu’une sérialisation demandée depuis Start() n’atteint pas les joueurs qui rejoignent ensuite. Envoyez-la depuis un événement, ou depuis OnPlayerJoined.

Une synchro manuelle qui ne sérialise jamais — avertissement

Section intitulée « Une synchro manuelle qui ne sérialise jamais — avertissement »

La synchro manuelle n’envoie rien tant qu’on ne le demande pas. Sans un seul RequestSerialization(), les variables sont en pratique locales.

Les raccourcis du Core comptent comme une sérialisation : un script appelant FOSSync() ou FOSTakeOwnershipAndSync() n’est pas signalé, puisque tous deux en demandent une pour vous.

Sérialiser sans vérifier l’ownership — avertissement

Section intitulée « Sérialiser sans vérifier l’ownership — avertissement »

Seul le propriétaire peut sérialiser. Appelé par quelqu’un d’autre, RequestSerialization() ne fait silencieusement rien — la panne la plus déroutante d’Udon, parce que tout paraît normal en local.

Une synchro continue portant un tableau ou une chaîne — avertissement

Section intitulée « Une synchro continue portant un tableau ou une chaîne — avertissement »

La synchro continue est plafonnée à environ 200 octets par comportement. Un champ de longueur variable dépasse cette limite sans prévenir. La synchro manuelle en transporte bien davantage.

Plusieurs comportements sur un objet, en désaccord sur le mode — erreur

Section intitulée « Plusieurs comportements sur un objet, en désaccord sur le mode — erreur »

VRChat applique un seul mode de synchro par GameObject. Posez deux comportements Udon sur le même objet et les autres héritent du mode qui l’emporte, quel que soit celui que déclare leur propre script — un affichage réglé sur NoVariableSync posé à côté d’une autorité en Manual dégrade silencieusement cette autorité.

C’est la cause qui se cache derrière le constat précédent. Sans elle, vous réparez le mode enregistré, vous sauvegardez, et il revient à la recompilation suivante, sans que rien n’indique d’où.

La correction n’est jamais une valeur à changer : déplacez le comportement qui synchronise sur son propre GameObject.

Sans [UdonBehaviourSyncMode], le mode vaut Any par défaut et reste modifiable dans l’inspecteur, où il peut être changé par accident.

Un événement diffusé qui agit sur le joueur local — avertissement

Section intitulée « Un événement diffusé qui agit sur le joueur local — avertissement »

Celui qui coûte le plus de temps à comprendre. Un événement réseau envoyé à tous les clients s’exécute sur tous les clients, et Networking.LocalPlayer y désigne un joueur différent sur chacun. Une téléportation destinée à une personne déplace toute l’instance.

Des événements joueur utilisés sans isLocal — avertissement

Section intitulée « Des événements joueur utilisés sans isLocal — avertissement »

OnPlayerTriggerEnter et ses semblables se déclenchent sur tous les clients, pour chaque joueur entrant. Sans la vérification, un inconnu traversant votre volume déclenche l’effet sur votre machine.

Un événement réseau dont le nom commence par _ — avertissement

Section intitulée « Un événement réseau dont le nom commence par _ — avertissement »

VRChat refuse d’exécuter un tel événement à distance. L’appel part, rien ne se passe, et rien n’est journalisé.


Les constats sont de deux natures, et la fenêtre ne les mélange jamais.

Les constats certains sont établis en inspectant les types compilés : quels champs portent [UdonSynced], quel mode de synchro est déclaré, si OnDeserialization est surchargé. Ce sont des faits.

Les constats probables sont déduits du texte de vos scripts, car le corps d’une méthode ne peut pas être inspecté autrement. « Ce script n’appelle jamais RequestSerialization » est faux si un autre script l’appelle pour lui. Ces constats portent la mention probable et méritent un coup d’œil plutôt qu’une correction aveugle.

Les commentaires et les chaînes littérales sont retirés avant toute recherche : un script qui explique « pas de vérification d’ownership ici » dans un commentaire n’est donc pas pris pour un script qui effectue la vérification.

Un outil d’audit incapable de vous dire à quel point lui faire confiance ne vaut pas grand-chose.


  • Il lit vos scripts, et une seule chose dans votre scène : le mode de synchro enregistré sur chaque composant. Le câblage lui échappe — un comportement parfaitement écrit mais pointé vers le mauvais objet lui paraît irréprochable.
  • Il ne vérifie ni les performances, ni l’éclairage, ni les budgets Quest. VRWorldToolkit le fait bien, et gratuitement.
  • Il ne change rien de lui-même. Chaque constat est un rapport, et l’unique bouton Fix — sur un mode de synchro contradictoire — n’agit que si vous cliquez dessus.

Par défaut, les packs FOS eux-mêmes sont ignorés : vous auditez votre monde, pas cette ligne d’outils. L’interrupteur existe si vous voulez regarder.