Zum Inhalt springen

FOS Tablet System — Standard

Version 2.2.1 · benötigt FOS Essentials Core 1.3.0 oder neuer · benötigt außerdem FOS Localization 1.0.1, FOS Teleport 1.0.1

Ein Tablet, das sich Spielende vor sich holen: Teleport-Menü, lokale Schalter, Weltregeln und ein vollständiges Moderationspanel mit Rollen, Bewegungssperre, Isolation, Stummschaltung und synchronisiertem Protokoll.

Benötigt FOS Essentials Core 1.3.0, FOS Localization 1.0.0 und FOS Teleport 1.0.0.

Du steigst von einer älteren Fassung um? Lies zuerst CHANGELOG.md — ein Prefab, das du verändert hast, wandert nicht von selbst mit.


Dieses Pack erscheint in Editionen, jede in ihrem eigenen Ordner:

Assets/FOS/TabletSystem/
└── Standard/ ← du bist hier

Eine künftige Pro-Edition liegt daneben unter Pro/, mit eigener Assembly und eigenen Komponenten. Sie ergänzt Komponenten neben denen des Standard und spricht mit ihnen über deren öffentliche API — sie ersetzt nie eine Komponente am Prefab. Ein Umstieg kostet dich daher nie die bereits erledigte Verdrahtung.


  1. Ziehe FOS Essentials > FOS Tablet System > Standard > FOSTabletSystem in deine Szene.
  2. Weise die Isolationszone zu: ein leeres Transform, irgendwo abseits. Ohne sie bewirkt das Isolieren einer Person nichts.
  3. Weise das Feld Spielerregister am Staff-Manager zu. FOSPlayerRegistry stammt aus dem Core und lebt auf einem eigenen GameObject — nie am Staff-Manager selbst. VRChat wendet einen Sync-Modus je Objekt an, und das Register deklariert NoVariableSync: Auf demselben Objekt würde es die manuelle Synchronisierung des Staff-Managers mit herunterziehen. Das Feld ist optional, aber ohne es reserviert die Spielerliste bei jedem Beitritt und jedem Verlassen ein Array.
  4. Trage die Rückstellwerte am Staff-Manager so ein, dass sie zu den Bewegungs- und Sprachwerten deiner Welt passen. Sie sind das, was jemand zurückbekommt, wenn die Sperre oder die Stummschaltung aufgehoben wird, und sie überschreiben das Vorherige.
  5. Trage deine Teleportziele, deine Schaltergruppen und deine Regeln ein.

Komponente Aufgabe Netzwerk
FOSTabletManager Holt, platziert und schließt das Tablet keines
FOSTabletCaller Ruft das Tablet an einen festen Ständer zurück keines
FOSTabletSettings Persönliche Regler, Gemeinschaftseinstellungen, Regeln manuell
FOSTabletToggleGroup Objekte, die gemeinsam ein- und ausgeschaltet werden keines
FOSTabletToggleButton Schaltfläche, die eine Gruppe steuert keines
FOSTabletStaffManager Rollen, Sperre, Isolation, Stummschaltung, Autorität manuell
FOSTabletStaffRow Die Zeile einer Person im Staff-Panel keines
FOSTabletPermissions Sichtbarkeit von Objekten je Rolle keines
FOSTabletPermissionRow Die Zeile einer Person im Rollen-Panel keines
FOSTabletLogManager Synchronisiertes Moderationsprotokoll manuell
FOSTabletLogRow Eine Protokollzeile keines

Das ist der Teil, den man lesen sollte, bevor man eine Welt damit veröffentlicht.

Der Besitzer des Staff-Managers ist die einzige Autorität. Jede Moderationsaktion ist eine Anfrage an diesen Besitzer über Network Calling. Der Besitzer prüft die echte aufrufende Person mit NetworkCalling.CallingPlayer, was sich nicht fälschen lässt, und schreibt erst dann. Ein veränderter Client kann die Anfrage senden; sie wird abgelehnt.

Synchronisierte Variablen tragen Zustand, nie Befehle. Genau das macht spät Hinzukommende sicher: Wer eintrifft, wendet den aktuellen Zustand an, statt veraltete Aktionen zu wiederholen. Ein SendCustomNetworkEvent wird für sie nie wiederholt — und genau deshalb lebt der Zustand nicht in Ereignissen.

Ownership bleibt dem Team vorbehalten. Verlässt der Besitzer die Instanz und legt VRChat das Objekt bei einer besuchenden Person ab, holt es sich das Teammitglied mit der niedrigsten Spieler-ID zurück — eine deterministische Regel, damit ein Client handelt und nicht alle auf einmal.

Der erste Admin ist die erste Person der Instanz, festgehalten über den Anzeigenamen. Dem Master zu vertrauen wäre eine Lücke: Der Master wechselt jedes Mal, wenn jemand geht, und die Admin-Rolle landete irgendwann bei einer fremden Person. Wer die Instanz erstellt, gilt ebenfalls als Admin, und die gründende Person kann nie herabgestuft werden — weder von einer Moderation noch von einem anderen Admin.

Die Prüfungen in den Zeilenkomponenten sind reine Oberflächenprüfungen. Sie vermeiden Anfragen, die ohnehin abgelehnt würden, und verhindern, dass Besuchende auf tote Schaltflächen klicken. Sie sind keine Sicherheitsbarriere und geben auch nicht vor, eine zu sein.

Isolation ist eine zeitweilige Absonderung innerhalb der laufenden Instanz. Eine VRChat-Welt kann — und darf — keinen dauerhaften Bann durchsetzen. Ein erneuter Beitritt hebt sie auf, so ist es gedacht.

Eine isolierte Person wird in die Isolationszone teleportiert und alle zwei Sekunden zurückgeschickt, wenn sie deren Radius verlässt. Auch ein Respawn befreit sie nicht.


Rolle Wert Darf
Besucher 0 nichts
VIP 1 nichts weiter; die Rolle existiert für die Sichtbarkeitsregeln
Moderation 2 sperren, isolieren, stummschalten, Rollen bis zur Moderation vergeben
Admin 3 all das, dazu Admins ernennen und die Gemeinschaftseinstellungen

Gleiche Ränge dürfen aufeinander wirken — zwei Moderierende können sich gegenseitig neutralisieren. Das ist eine bewusste Entscheidung für den Moment, in dem eine davon entgleist.

Verlässt der letzte Admin die Instanz, wird die erste Moderation automatisch befördert. Ohne diese Nachfolge verliert eine Instanz jede Moderation, bis sie neu gestartet wird.

Jede Zeile des Rollen-Panels trägt vier Schaltflächen — Besucher, VIP, Moderation, Admin — und mehr braucht eine Welt mit den vier Standardrollen nicht.

Eine Welt, die eigene Rollen definiert, braucht etwas, das nicht mit deren Anzahl wächst. FOS Essentials > FOS Tablet System > Build role selector fügt einer Zeile eines hinzu: zwei Pfeile, eine Beschriftung, eine Übernehmen-Schaltfläche.

Es klont eine der Rollen-Schaltflächen, die bereits in dieser Zeile liegen, sodass die Auswahl deine Farben, deine Schrift und deine Maße erbt, statt mit unseren anzukommen. Positioniere die vier erzeugten Objekte und speichere.

Die Pfeile laufen durch alle Rollen; entschieden wird mit der Übernehmen-Schaltfläche. So sagt eine gesperrte Schaltfläche etwas Genaues — diese Rolle nicht, für diese Person — statt wie ein Defekt zu wirken. Sie bleibt gesperrt, solange die Auswahl die Rolle ist, die die Person bereits hat.

Die Beschriftung stammt aus der Rollenliste und folgt damit sowohl deinen Namen als auch der Sprache jeder Person.

Die Rollen Moderation und Admin werden nur für die laufende Instanz gemerkt, über den Anzeigenamen. Wer aus dem Team abstürzt und in dieselbe Instanz zurückkehrt, erhält seine Rolle wieder.

Zwischen Sitzungen oder über Instanzen hinweg wird nichts gespeichert. Verschiedene Gruppen öffnen Instanzen derselben Welt, und Rechte aus der einen haben in der anderen nichts verloren. VIP wird nicht gemerkt, und Isolation bewusst ebenfalls nicht.


FOSTabletPermissions zeigt und verbirgt Objekte je nach Rolle der lokalen Person.

Rollen sind kumulativ: Eine Rolle bekommt alles, was den darunterliegenden Rollen gezeigt wird. Ein Admin sieht die Objekte für Besucher, VIP und Moderation, ohne dass du sie in vier Listen kopierst — dieses Kopieren war der häufigste Konfigurationsfehler und der mühsamste rückgängig zu machen.

Die Listen „verborgen vor” sind Ausnahmen für eine Rolle, zuletzt angewandt. Ein Objekt, das nur in verborgen vor der Moderation auftaucht, ist für alle sichtbar außer für die Moderation.

Die beiden Team-Listen fragen nach einer Fähigkeit, nicht nach einem Rang. Gezeigt der Moderation heißt „jeder Rolle, die das Staff-Panel öffnen darf”, Gezeigt den Admins „jeder Rolle, die die Gemeinschaftseinstellungen bearbeiten darf”. Mit den vier Standardrollen ist das genau dasselbe. Es hört auf, dasselbe zu sein, sobald eine Welt eigene Rollen definiert: Eine begrüßende Rolle auf Stufe 2 würde sonst über einen Rangvergleich das Moderationspanel erben, ohne eine einzige seiner Befugnisse zu besitzen.

Das ist Darstellung, kein Schutz. Ein Objekt zu verbergen hindert niemanden daran, es anders zu erreichen.


Eine FOSTabletToggleGroup hält eine Liste von Objekten und einen Zustand, der für alle gilt. Ein FOSTabletToggleButton zeigt auf eine Gruppe — direkt, nicht über einen Textschlüssel.

Die Schalter sind bewusst lokal. Eine Komforteinstellung hat keinen Grund, dem Rest der Instanz aufgezwungen zu werden, und sie zu synchronisieren verbrauchte Bandbreite für etwas, das niemand verlangt hat.

Mehrere Schaltflächen dürfen dieselbe Gruppe steuern: Sie melden sich bei ihr an, und ihre Anzeigen bleiben einig.


Text im Spiel läuft über FOS Localization. Weise den Locale-Manager zu und gib die Übersetzungsschlüssel an:

Wo Schlüssel
FOSTabletStaffManager vier Rollennamen, in dieser Reihenfolge: Besucher, VIP, Moderation, Admin
FOSTabletSettings Standardregeln, Regeln für Erwachseneninhalte

Ohne Locale-Manager werden die neben diesen Feldern hinterlegten Ersatztexte verwendet, und das Tablet arbeitet in einer Sprache.

Jede eigene Beschriftung ist ein FOSLocalizedText, wie überall sonst in deiner Welt.


Die Teleport-Schaltflächen im Tablet sind Komponenten von FOS Teleport: ein FOSTeleportButton je Ziel, mit seinem Ziel-Transform. Dieses Pack bringt keinen eigenen Teleporter mit.

Die einzige Ausnahme ist der Teleport zu einer Person im Staff-Panel: FOS Teleport zielt auf ein festes Transform in der Szene, während dieses Ziel eine Person ist, die sich bewegt und zwischen Klick und Ankunft gehen kann. Hier bleibt es nativ und scheitert stillschweigend, wenn das Ziel weg ist.


Jeder Einstiegspunkt unten kommt ohne Parameter aus, jedes Skript erreicht ihn also mit SendCustomEvent.

Aufruf An Wirkung
SummonTablet() / CloseTablet() FOSTabletManager Öffnet oder schließt das Tablet
RecallTablet() FOSTabletCaller Holt das Tablet an seinen Ständer zurück
FOSToggle() FOSTabletToggleGroup / FOSTabletToggleButton Kippt eine Gruppe
FOSRoleOf(id) / FOSIsStaff(id) / FOSIsAdmin(id) FOSTabletStaffManager Liest eine Rolle
FOSRequestFreeze/Isolation/Mute(id) FOSTabletStaffManager Fordert eine Aktion an
FOSRequestRole(id, role) FOSTabletStaffManager Fordert einen Rollenwechsel an
FOSAdultContentIsOn() FOSTabletSettings Liest den Zustand der Erwachseneninhalte

Drei Komponenten veröffentlichen ihre Zustandsänderungen auf dieselbe Weise. Rufe an einer davon FOSRegister(this) auf und stelle eine öffentliche parameterlose Methode mit passendem Namen bereit:

Sender Bereitzustellendes Event
FOSTabletStaffManager FOSApplyStaffState()
FOSTabletToggleGroup FOSApplyToggleState()
FOSLocaleManager FOSApplyLanguage()

Wer zuhört, sollte sich außerdem einmal im eigenen Start selbst anwenden: Die Anmeldung kann erfolgen, nachdem der Sender seinen Anfangszustand bereits gesetzt hat.

So dockt die Pro-Edition an, und so dockt auch alles an, was dieses Pack nicht abdeckt.


  • Ein Staff-Manager je Szene. Mehrere würden sich um dieselben Personen streiten.
  • Nichts überdauert eine Sitzung. Rollen leben nur in der laufenden Instanz.
  • Die Protokollgröße kostet Bandbreite. Jeder Eintrag wird synchronisiert; 30 ist ein sinnvoller Standardwert.
  • Die Rückstellwerte überschreiben die Einstellungen der Person. Passe sie an deine Welt an.
  • Quest und PC verhalten sich identisch: Es gibt keinen plattformspezifischen Code, und es könnte ihn nicht geben — Udon wird einmal für beide kompiliert.