Aller au contenu

FOS Tablet System — Standard

Version 2.2.1 · exige FOS Essentials Core 1.3.0 ou plus récent · exige aussi FOS Localization 1.0.1, FOS Teleport 1.0.1

Une tablette que le joueur fait apparaître devant lui : menu de téléportation, interrupteurs locaux, règlement du monde, et un panneau de modération complet avec rôles, immobilisation, isolement, coupure micro et journal synchronisé.

Exige FOS Essentials Core 1.3.0, FOS Localization 1.0.0 et FOS Teleport 1.0.0.

Vous venez d’une version antérieure ? Lisez d’abord CHANGELOG.md — un prefab que vous avez modifié ne se reporte pas tout seul.


Ce pack est livré en éditions, chacune dans son dossier :

Assets/FOS/TabletSystem/
└── Standard/ ← vous êtes ici

Une future édition Pro se place à côté, sous Pro/, avec sa propre assembly et ses propres composants. Elle ajoute des composants aux côtés de ceux du Standard et dialogue avec eux par leur API publique — elle ne remplace jamais un composant du prefab. La mise à niveau ne vous coûte donc jamais le câblage déjà fait.


  1. Posez FOS Essentials > FOS Tablet System > Standard > FOSTabletSystem dans votre scène.
  2. Affectez la zone d’isolement : un Transform vide, quelque part à l’écart. Sans elle, isoler un joueur ne fait rien.
  3. Affectez le champ registre de joueurs du staff manager. FOSPlayerRegistry vient du Core et vit sur son propre GameObject — jamais sur le staff manager lui-même. VRChat applique un seul mode de synchro par objet, et le registre déclare NoVariableSync : posé sur le même objet, il entraînerait la synchro manuelle du staff manager avec lui. Le champ est facultatif, mais sans lui la liste de joueurs alloue un tableau à chaque arrivée et à chaque départ.
  4. Renseignez les valeurs restaurées du staff manager pour qu’elles correspondent aux réglages de déplacement et de voix de votre monde. Ce sont elles qu’un joueur récupère quand on le libère ou qu’on lui rend le micro, et elles écrasent ce qu’il avait.
  5. Renseignez vos destinations de téléportation, vos groupes d’interrupteurs et votre règlement.

Composant Rôle Réseau
FOSTabletManager Fait apparaître, place et ferme la tablette aucun
FOSTabletCaller Rappelle la tablette sur un support fixe aucun
FOSTabletSettings Curseurs personnels, réglages communautaires, règlement manuel
FOSTabletToggleGroup Objets allumés et éteints ensemble aucun
FOSTabletToggleButton Bouton pilotant un groupe aucun
FOSTabletStaffManager Rôles, immobilisation, isolement, micro, autorité manuel
FOSTabletStaffRow La ligne d’un joueur dans le panneau staff aucun
FOSTabletPermissions Visibilité des objets par rôle aucun
FOSTabletPermissionRow La ligne d’un joueur dans le panneau des rôles aucun
FOSTabletLogManager Journal de modération synchronisé manuel
FOSTabletLogRow Une ligne de journal aucun

C’est la partie à lire avant de livrer un monde équipé de ce pack.

Le propriétaire du staff manager est la seule autorité. Chaque action de modération est une requête envoyée à ce propriétaire via Network Calling. Le propriétaire vérifie le vrai joueur appelant avec NetworkCalling.CallingPlayer, qui ne peut pas être falsifié, et n’écrit qu’ensuite. Un client modifié peut envoyer la requête ; elle sera refusée.

Les variables synchronisées portent un état, jamais des commandes. C’est ce qui rend les arrivants tardifs sûrs : un joueur qui arrive applique l’état courant au lieu de rejouer des actions périmées. Un SendCustomNetworkEvent ne leur est jamais rejoué, et c’est précisément pourquoi l’état ne vit pas dans des événements.

L’ownership est réservé au staff. Si le propriétaire part et que VRChat dépose l’objet sur un visiteur, le membre du staff au plus petit identifiant de joueur le récupère — une règle déterministe, pour qu’un seul client agisse et non tous à la fois.

Le premier admin est le premier joueur de l’instance, verrouillé par son nom affiché. Faire confiance au master serait une faille : le master change chaque fois que quelqu’un part, et l’admin finirait par échoir à un inconnu. Le créateur de l’instance est également reconnu comme admin, et le fondateur ne peut jamais être rétrogradé — ni par un modérateur, ni par un autre admin.

Les vérifications dans les composants de ligne sont des vérifications d’interface. Elles évitent d’envoyer une requête qui sera refusée et empêchent un visiteur de cliquer sur des boutons morts. Ce ne sont pas des barrières de sécurité et elles ne prétendent pas l’être.

Ce qu’est l’isolement, et ce qu’il n’est pas

Section intitulée « Ce qu’est l’isolement, et ce qu’il n’est pas »

L’isolement est un confinement temporaire dans l’instance en cours. Un monde VRChat ne peut pas — et ne doit pas — imposer un bannissement persistant. Rejoindre à nouveau l’efface, et c’est voulu.

Un joueur isolé est téléporté dans la zone d’isolement et y est renvoyé toutes les deux secondes s’il sort de son rayon. Réapparaître ne le libère pas non plus.


Rôle Valeur Peut
Visiteur 0 rien
VIP 1 rien de plus ; le rôle existe pour les règles de visibilité
Modérateur 2 immobiliser, isoler, couper le micro, attribuer les rôles jusqu’à modérateur
Admin 3 tout cela, plus promouvoir des admins et les réglages communautaires

Les rangs égaux peuvent agir les uns sur les autres — deux modérateurs peuvent se neutraliser. C’est un choix délibéré, pour le moment où l’un d’eux dérape.

Si le dernier admin part, le premier modérateur est promu automatiquement. Sans cette succession, une instance perd toute modération jusqu’à son redémarrage.

Chaque ligne du panneau des rôles porte quatre boutons — visiteur, VIP, modérateur, admin — et c’est tout ce dont a besoin un monde qui garde les quatre rôles par défaut.

Un monde qui définit ses propres rôles a besoin de quelque chose qui ne grandit pas avec leur nombre. FOS Essentials > FOS Tablet System > Build role selector en ajoute un à une ligne : deux flèches, une étiquette, un bouton d’application.

Il clone l’un des boutons de rôle déjà présents sur la ligne, si bien que le sélecteur hérite de vos couleurs, de votre police et de vos dimensions plutôt que d’arriver avec les nôtres. Positionnez les quatre objets qu’il crée, et sauvegardez.

Les flèches parcourent tous les rôles ; c’est le bouton d’application qui tranche. Ainsi, un bouton verrouillé dit quelque chose de précis — pas ce rôle-là, à cette personne-là — au lieu de passer pour une panne. Il reste verrouillé tant que la sélection est le rôle que le joueur détient déjà.

L’étiquette vient de la liste des rôles : elle suit donc à la fois vos noms et la langue de chaque joueur.

Les rôles de modérateur et d’admin sont mémorisés pour l’instance en cours seulement, par nom affiché. Un membre du staff qui plante et revient dans la même instance retrouve son rôle.

Rien n’est conservé entre les sessions ni d’une instance à l’autre. Des groupes différents ouvrent des instances du même monde, et les permissions de l’une n’ont rien à faire dans l’autre. Le VIP n’est pas mémorisé, et l’isolement ne l’est délibérément pas non plus.


FOSTabletPermissions affiche et masque des objets selon le rôle du joueur local.

Les rôles sont cumulatifs : un rôle obtient tout ce qui est montré aux rôles inférieurs. Un admin voit les objets visiteur, VIP et modérateur sans que vous les recopiiez dans quatre listes — cette recopie était l’erreur de configuration la plus fréquente et la plus fastidieuse à défaire.

Les listes « masqué pour » sont des exceptions pour un rôle, appliquées en dernier. Un objet qui n’apparaît que dans masqué pour les modérateurs est visible par tout le monde sauf les modérateurs.

Les deux listes staff demandent une capacité, pas un rang. Montré aux modérateurs signifie « à tout rôle autorisé à ouvrir le panneau staff », Montré aux admins « à tout rôle autorisé à modifier les réglages communautaires ». Avec les quatre rôles par défaut, c’est exactement la même chose. Ça cesse de l’être le jour où un monde définit ses propres rôles : un accueillant placé au niveau 2 hériterait sinon du panneau de modération par comparaison de rangs, sans détenir un seul de ses pouvoirs.

C’est de la présentation, pas de la protection. Masquer un objet n’empêche personne de l’atteindre autrement.


Un FOSTabletToggleGroup porte une liste d’objets et un état, appliqué à tous. Un FOSTabletToggleButton pointe vers un groupe — directement, pas par une clé texte.

Les interrupteurs sont locaux à dessein. Un réglage de confort n’a aucune raison d’être imposé au reste de l’instance, et le synchroniser dépenserait de la bande passante pour quelque chose que personne n’a demandé.

Plusieurs boutons peuvent piloter le même groupe : ils s’y enregistrent et leurs voyants restent d’accord.


Le texte affiché en jeu passe par FOS Localization. Affectez le locale manager et donnez les clés de traduction :

Où Clés
FOSTabletStaffManager quatre noms de rôles, dans l’ordre : visiteur, VIP, modérateur, admin
FOSTabletSettings règlement standard, règlement adulte

Sans locale manager, les textes de repli écrits à côté de ces champs sont utilisés, et la tablette fonctionne dans une seule langue.

Toute étiquette qui vous appartient est un FOSLocalizedText, comme partout ailleurs dans votre monde.


Les boutons de téléportation de la tablette sont des composants FOS Teleport : un FOSTeleportButton par destination, avec son Transform cible. Ce pack ne livre pas son propre téléporteur.

L’unique exception est la téléportation vers un joueur du panneau staff : FOS Teleport vise un Transform fixe dans la scène, alors que cette destination est un joueur qui se déplace et peut partir entre le clic et l’arrivée. Elle reste native ici, et échoue en silence si la cible n’est plus là.


Chaque point d’entrée ci-dessous est sans paramètre : n’importe quel script peut donc l’atteindre avec SendCustomEvent.

Appel Sur Effet
SummonTablet() / CloseTablet() FOSTabletManager Ouvre ou ferme la tablette
RecallTablet() FOSTabletCaller Ramène la tablette sur son support
FOSToggle() FOSTabletToggleGroup / FOSTabletToggleButton Inverse un groupe
FOSRoleOf(id) / FOSIsStaff(id) / FOSIsAdmin(id) FOSTabletStaffManager Lit un rôle
FOSRequestFreeze/Isolation/Mute(id) FOSTabletStaffManager Demande une action
FOSRequestRole(id, role) FOSTabletStaffManager Demande un changement de rôle
FOSAdultContentIsOn() FOSTabletSettings Lit l’état du contenu adulte

Trois composants publient leurs changements d’état de la même façon. Appelez FOSRegister(this) sur l’un d’eux, et exposez une méthode publique sans paramètre au nom correspondant :

Émetteur Événement à exposer
FOSTabletStaffManager FOSApplyStaffState()
FOSTabletToggleGroup FOSApplyToggleState()
FOSLocaleManager FOSApplyLanguage()

Un écouteur devrait aussi s’appliquer une fois dans son propre Start : il peut s’enregistrer après que l’émetteur a déjà posé son état initial.

C’est ainsi que se branche l’édition Pro, et ainsi que se branche tout ce que ce pack ne couvre pas.


  • Un staff manager par scène. Plusieurs se disputeraient les mêmes joueurs.
  • Rien ne persiste entre les sessions. Les rôles ne vivent que dans l’instance en cours.
  • La taille du journal coûte de la bande passante. Chaque entrée est synchronisée ; 30 est une valeur par défaut raisonnable.
  • Les valeurs restaurées écrasent les réglages du joueur. Accordez-les à votre monde.
  • Quest et PC se comportent à l’identique : il n’y a pas de code spécifique à une plateforme, et il ne pourrait pas y en avoir — Udon est compilé une seule fois pour les deux.