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.
Rien n’est ajouté à votre monde
Section intitulée « Rien n’est ajouté à votre monde »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.
Ce qu’il vérifie
Section intitulée « Ce qu’il vérifie »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.
Aucun mode de synchro déclaré — note
Section intitulée « Aucun mode de synchro déclaré — note »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é.
Certain, et probable
Section intitulée « Certain, et probable »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.
Ce qu’il ne fait pas
Section intitulée « Ce qu’il ne fait pas »- 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.
