Freigeben über


Visual Scripting-Programmierhandbuch für Gitter

Wechseln Sie zum Übersichtsartikel " Visual Scripting"

Begrenzungen

  • Nur eine Teilmenge der Unity-Funktionalität wird für visuelle Skripts verfügbar gemacht.
  • Variablen und Eigenschaften mit nicht einfachen Typen (einschließlich Objektverweise) werden nicht automatisch freigegeben. Weitere Informationen hierzu finden Sie weiter unten unter "Freigabe und Netzwerk ".

Hello World

Das einfachste visuelle Skript, das Sie erstellen können, ist ein Skript, das einfach ein Meldungsfeld öffnet:

Screenshot des visuellen Skriptdiagramms des beispiels Hallo Welt

So sieht es in Mesh aus:

Gitterbrowserfenster mit einem Popupdialogfeld, in dem Hallo Welt und eine Schaltfläche

Screenshot des Unity-Editors mit geöffneter visueller Gitterskripterstellung Hallo Welt Szene.

Testen ihrer Skripts

Bevor Sie Ihre Szene in Mesh hochladen, können Sie visuelle Skripts entwickeln und testen, auch mit mehreren Clients im Geteilten Bildschirmmodus, mithilfe des Wiedergabemodus mit Gitteremulation.

Visuelle Skriptdiagnose im Editor

Wenn ein GameObject mit einem Skriptcomputer in der Transformationshierarchie ausgewählt ist, zeigt Mesh den Bereich "Mesh Visual Scripting Diagnostics " am unteren Rand des Inspektorbereichs an:

Screenshot des Diagnosebereichs

Der Diagnosebereich gibt sofortiges Feedback zu Warnungen oder Fehlern, die verhindern können, dass Ihre Skripts in Mesh gut funktionieren.

Aktuelle Einschränkung: Zukünftige Versionen des Diagnosebereichs können auch Einblicke in die Verwendung freigegebener Variablen und Eigenschaften des visuellen Skripts geben und zusätzliche Diagnosen und Warnungen anzeigen.

Hochladen in Gitter

Verwenden Sie den Gitteruploader , um Szenen hochzuladen, die visuelle Skripts enthalten. Um den Uploader zu öffnen, wählen Sie im Menü "Mesh Toolkit" die Option "Umgebungen" aus.

Hinweis: Der Mesh Uploader überprüft visuelle Skripts vor dem Hochladen und lehnt das Hochladen ab, wenn in visuellen Skripts Überprüfungsfehler auftreten. Detaillierte Diagnosen werden in der Konsole ausgegeben.

Freigabe und Netzwerk

Freigegebener und lokaler Skriptstatus

Mesh verwendet Unity Visual Scripting, das ohne Netzwerk funktionieren soll. Visuelle Skripts werden auf jedem Client unabhängig ausgeführt. Die Gittererfahrung der Benutzer wird jedoch geteilt; Alle Benutzer erleben eine einzelne freigegebene Szene, die auf allen Clients gleich aussieht.

Der Effekt der Ausführung eines visuellen Skripts ist, wie er den Zustand der Szene ändert.

Standardmäßig repliziert Mesh szenenänderungen, die von visuellen Skripts auf einem Client auf allen anderen Clients vorgenommen werden. Abgesehen von allem, was in einer Szene geteilt wird, bleibt ein Zustand unabhängig von jedem Client (also lokal).

Lokale Änderungen haben vorübergehend Vorrang vor Änderungen, die von Clients stammen. Beispiel: Wenn Sie ein Objekt lokal animieren, wird ihre lokale Animation nicht durch Änderungen von anderen Clients beeinträchtigt.

Es gibt einige einschränkungen bei der automatischen Aktualisierungsrate. Ein Client sendet keine zusätzlichen Updates, während ein Kunde noch im Test-Flight ist. es gibt ein Update, das pro Roundtrip über den Server gesendet wird. Dies beträgt etwa fünf bis sechs Updates pro Sekunde in praktischen Situationen. Dies bedeutet, dass eine reibungslose Animation, die von einem Client gesteuert wird, auf anderen Clients nicht reibungslos aussieht. Die bewährte Methode besteht darin, reibungslose Animationen lokal zu erledigen, idealerweise nicht durch visuelle Skripts, sondern über das normale Unity-Animationssystem.

Die letztendliche Konsistenz des freigegebenen Zustands ist gewährleistet (auch wenn die Zustände von Clients vorübergehend unterschiedlich sein können).

Lokaler Zustand:

  • Natürlicher lokaler Zustand – Sounds, UI, Rendering.
  • Vom Benutzer gesteuerter lokaler Zustand – Teilszenen, die mit der Komponente " Lokaler Skriptbereich" gekennzeichnet sind.
  • Technischer lokaler Zustand – Objekte, die nicht Teil der Szenenhierarchie sind (z. B. Renderermaterialien, Ressourcen).

Freigegebener Zustand:

  • Beschränkt auf visuelle Skriptvariablen und die Eigenschaften von GameObjects und Szenenkomponenten, die Teil der Szenenhierarchie sind.
  • Es können nur Variablen und Eigenschaften einfacher Typen repliziert werden: Ganze Zahlen, Gleitkommazahlen, Booleanen, Zeichenfolgen, Color, ,3/Vector2/4 , Quaternion, Matrix4x4und .Rect

Jede Änderung des freigegebenen Zustands wird über das Netzwerk gesendet. Dies erhöht den Netzwerkdatenverkehr und kann, wenn sie achtlos verwendet wird, erhebliche Bandbreite verbrauchen.

Freigegebene und lokale Skripttrigger

Alle visuellen Skriptflüsse beginnen als Reaktion auf ein Ereignis.

  • Wenn das Ereignis auf einem einzelnen Client stammt (z. B. klickt der Benutzer auf eine Schaltfläche), wird das visuelle Skript nur auf diesem Client ausgeführt.
  • Wenn das Ereignis auf allen Clients auftritt, wird das visuelle Skript auf allen Clients ausgeführt (z. B. Timerereignis, Änderung der freigegebenen Eigenschaft, Aktualisierung der freigegebenen Variablen, Avatar wechselt triggern, physische Körpereingaben kollidieren).

Wenn Sie einen Knoten hinzufügen, um zu erkennen, ob ein Objekt ausgewählt ist, ist es wichtig, das richtige auszuwählen. Sie haben zwei Möglichkeiten: Gitterinteraktionsfähiger Textkörper : Ist lokal ausgewählt und interagierbarer Gittertext: Ist ausgewählt. Angenommen, Sie möchten über eine Schaltfläche verfügen, auf die geklickt werden kann, um die Teleportation auszulösen. Damit der Teilnehmer nur auf die Schaltfläche klickt und nur selbst transportiert, verwenden Sie den interagierbaren Gittertext: Ist lokal ausgewählt.

Screenshot des lokalen Knotens

Damit der Teilnehmer auf die Schaltfläche klickt und alle Benutzer in der Oberfläche teleportiert, verwenden Sie den interagierbaren Gittertext: Is Selected node. In jedem Fall weist der Text oberhalb des Knotens das erwartete Verhalten an:

Screenshot des Knotens

Wenn ein lokales Skript eine freigegebene Variable festlegt und ein zweites Skript änderungen an dieser Variablen überwacht (unter Verwendung des Triggers "On State Changed "; siehe unten), wird das zweite Skript auf allen Clients ausgeführt.

Mesh bietet einige spezielle Skriptknoten:

  • Bei Intervalltriggern in regelmäßigen Intervallen synchron auf allen Clients.
  • Beim Ändern des Zustands wird ausgelöst, wenn sich die Eingaben ändern (z. B. freigegebene Eigenschaften, freigegebene Variablen, lokal).
  • Im Dialogfeld anzeigen wird ein Meldungsdialogfeld mit benutzerdefiniertem Text angezeigt, der optional Schaltflächen als Antwortoptionen bereitstellt.

Gitter macht bestimmte Kompromisse zugunsten der Einfachheit:

  • Wenn mehrere Clients versuchen, dieselben Daten zu ändern, gewinnt der letzte Client (anstatt ein transaktionsbasiertes Datenaktualisierungsmodell zu verwenden).
  • Um die Datenkonsistenz sicherzustellen, dürfen visuelle Skripts, die auf allen Clients ausgeführt werden, keine freigegebenen Eigenschaften oder Variablen lesen und dann schreiben. Wenn dies geschieht, löst sie einen Laufzeitfehler aus und bricht die Ausführung des Skriptflusses ab.

Bewährte Methoden

Visuelle Skripts sind wesentlich langsamer als systemeigener C#-Code. Darüber hinaus erweitert Mesh visuelle Skripts mit Netzwerk- und anderen Integrationsfeatures, und scheinbar weniger visuelle Skriptaktionen können zu Netzwerkdatenverkehr führen.

Leistungsprobleme in visuellen Skripts werden fast immer durch skripts verursacht, die hochfrequente Aktualisierungen von Variablen oder Komponenteneigenschaften ausführen, die standardmäßig freigegeben werden.

  • Verwenden Sie lokale Skriptbereichskomponenten liberal, um sicherzustellen, dass nur Variablen und Komponenteneigenschaften synchronisiert werden müssen, die über Clients hinweg synchronisiert werden müssen . Alles, was lokal mit einem visuellen Skript animiert wird, sollte nicht freigegeben werden.

  • Verwenden Sie den On State Changed-Skripttrigger , um Skriptflüsse als Reaktion auf das Ändern von Variablen oder Komponenteneigenschaften zu starten. Dies funktioniert sowohl für den lokalen als auch für den freigegebenen Zustand. Außerdem wird empfohlen, lokale Animationen zu synchronisieren.

  • Verwenden Sie den On Interval-Skripttrigger anstelle eines Hochfrequenztriggers wie "Bei Update ", um Skriptflüsse in steuerbaren, regulären Intervallen zu starten.

Zu beachtende Dinge:

  • Vermeiden Sie nach Möglichkeit, visuelle Skripts für jeden Frame auszulösen. Verwenden Sie "On Update" anstelle von "On Update", " On State Changed " oder "On Interval".

  • Wenn Sie ein visuelles Skript für jeden Frame auslösen müssen, führen Sie es für so wenige Objekte wie möglich aus.

  • Aktualisieren Sie freigegebene Eigenschaften nicht mit hoher Häufigkeit. Erwägen Sie stattdessen, mithilfe der Komponente " Lokaler Skriptbereich " hochfrequente aktualisierte Eigenschaften lokal zu machen. Denken Sie daran, dass visuelle Skriptvariablen standardmäßig ebenfalls freigegeben werden!

  • Verwenden Sie keine Objektvariablen, wenn Flussvariablen funktionieren.

  • Vermeiden Sie das Aktualisieren freigegebener Eigenschaften oder Variablen in visuellen Skripts, die gleichzeitig auf allen Clients ausgelöst werden.

  • Vermeiden Sie das Festlegen von Physikeigenschaften (Transformation und Geschwindigkeit) auf demselben Physiktext auf mehreren Clients gleichzeitig. Dies kann bei visuellen Skripts, die auf Änderungsauslöser für freigegebene Szenen reagieren, leicht passieren.

  • Versuchen Sie nicht, Leistungsprobleme zu beheben, indem Sie mehrere Skriptflüsse konsolidieren, die an einzelnen Objekten arbeiten, in einem einzigen Skriptfluss, der für viele Objekte funktioniert. Der Aufwand für das Starten eines Skriptflusses ist vernachlässigbar, und die zusätzliche Komplexität, die Sie hinzufügen müssen, um Ihr Skript zu konsolidieren, kann einen geringen Leistungsvorteil, den Sie möglicherweise von der Reduzierung der Anzahl von ScriptMachines erhalten, sehr gut abgesehen haben.

Tipps

  • Komponenteneigenschaften und visuelle Skriptvariablen, die einfache Typen aufweisen, werden automatisch für Clients in einer Sitzung freigegeben. Um den Aufwand zu verringern, indem Sie die Freigabe einschränken, fügen Sie dem relevanten GameObject eine Komponente für den lokalen Skriptbereich hinzu, und führen Sie dann eine der folgenden Aktionen aus:

    So geben Sie visuelle Skriptvariablen, jedoch keine Komponenteneigenschaften oder Skriptvariablen oder Komponenteneigenschaften untergeordneter Objekte gemeinsam:
    Wählen Sie in der Komponente "Lokaler Skriptbereich" die Option "Visuelle Skriptvariablen für dieses Spielobjekt freigeben" aus.

    Screenshot der lokalen Skriptbereichskomponente mit der Eigenschaft

    So behalten Sie alle visuellen Skriptvariablen und Komponenteneigenschaften für das aktuelle Objekt und die zugehörigen untergeordneten Objekte lokal bei:
    Dies wird erreicht, indem Sie einfach die Komponente "Lokaler Skriptbereich" hinzufügen und visuelle Skriptvariablen für dieses Spielobjekt nicht ausgewählt lassen.

    Screenshot der lokalen Skriptbereichskomponente mit der Eigenschaft

    In Kapitel 3 unseres Lernprogramms "Mesh 101", das sich auf die visuelle Skripterstellung konzentriert, finden Sie mehrere Beispiele dafür, wie die Komponente "Lokaler Skriptbereich" verwendet wird.

  • Verwenden Sie den On Interval-Triggerknoten , um etwas in regelmäßigen Zeitintervallen in regelmäßigen Synchronisierungsintervallen über Clients hinweg auszuführen.

  • Verwenden Sie zum Ausführen einer Aktion als Reaktion auf bestimmte Komponenteneigenschaften oder visuelle Skriptvariablen, die geändert werden (z. B. weil dieser oder ein anderer Client sie in einem visuellen Skript festgelegt hat), den On State Changed Trigger

  • Es gibt zusätzliche Visuelle Skripting-Funktionen, die von Mesh bereitgestellt werden. Weitere Informationen finden Sie in den Abschnitten "Microsoft>Mesh" und "Microsoft>Events>Mesh" im Fuzzy Finder.

Sicherheit

Mesh schützt Benutzer vor Bedrohungsszenarien wie den folgenden:

  • Kompromittierte Szeneninhalte , z. B. böswillige Versuche, auf vertrauliche lokale Daten zuzugreifen.
  • Kompromittierter Client- oder Transportkanal , z. B. böswillige Versuche, auf Remotedaten auf anderen Clients zu lesen oder zu schreiben.

Um dies zu erreichen, führt Mesh visuelle Skripts in einer Sandbox (z. B. JavaScript in einem Webbrowser) aus.

Beim Szenenstart verwendet Mesh eine kuratierte Zulassungsliste, um visuelle Skripts zu überprüfen, um den Zugriff auf bestimmte Arten von Unity-Komponenten und eine sichere Teilmenge ihrer Eigenschaften zu beschränken.

Zur Szenenlaufzeit beschränkt Mesh den Zugriff auf bestimmte Teile der Szene:

  • Lokal: durch Verhindern des Zugriffs auf interne Gitter und andere vertrauliche Daten.
  • Remote: Indem Sie überprüfen, ob der Autor der Szene diesen Teil der Szene ändern will. Dies geschieht, indem visuelle Skripts auf der Seite des Empfängers für ihre potenziellen Szenenschreibvorgänge statisch analysiert werden.

Beispiele:

  • Ein böswilliges lokales Skript möchte allen Avataren bobble Köpfe geben. Zu diesem Zweck versucht es, die gesamte Szene nach GameObjects zu scannen, die Avatarköpfe darstellen. Gitter filtert automatisch die Scanergebnisse, um das Avatarsystem auszuschließen.
  • Ein böswilliger Remoteclient möchte die Szene durch Kippen aller GameObjects auf den Kopf stellen. Um dies zu erreichen, sendet sie eine Eigenschaftsaktualisierung, die die vertikale Skalierung jedes GameObjects in der Szene festlegt. Da jedoch kein visuelles Skript auf dem empfangenden Client darauf ausgelegt ist, eine ähnliche Aktion auszuführen, ignoriert der lokale Client die Remoteeingabe.

Mesh-Integration

Aktuelle Einschränkung: In diesem Abschnitt wird eine Vorschau der Noch ausgeführten Features beschrieben.

Im Allgemeinen erfolgt die Integration mit anderen Komponenten häufig durch Ändern und Überwachen von Komponenteneigenschaftenänderungen. Zum Beispiel:

  • Interagierbare Eigenschaften: Beobachten Sie die Eigenschaften "Ist zeigen" und "Ist ausgewählt".

  • Physikalische Interaktionen: Beobachten Sie Körper im Triggervolumen oder im Kontakt mit Kollidierung.

  • Avatare: Avatarposition lesen, Drehung anzeigen und Namensplatte anzeigen. (Noch nicht verfügbar.)

  • Sitzungszustand: Teilnehmer auflisten und Teilnehmerinformationen lesen. (Noch nicht verfügbar.)

  • Cloud Scripting: Arbeiten Sie zusammen mit Cloudskripts, die Variablen und Komponenteneigenschaften lesen und schreiben können. (Noch nicht verfügbar.)

Einige Komponenten stellen lokale Aktionen bereit:

  • Audio-Manager
  • Zeitachse
  • Animatoren
  • Rendering: Material- und Shadereigenschaften lesen und schreiben

Die Physik wird speziell behandelt, da die Simulation für ein bestimmtes Physikobjekt immer nur von einem Client autoritativ durchgeführt wird: seinem Besitzer. Damit diese Arbeit funktioniert, löst das Festlegen von Physikeigenschaften eine automatische Besitzübertragung an den Client aus, der die Änderung anwendet.

Nächste Schritte