Script Capabilities ist ein System, das die Kontrolle über Aktionen bietet, die Skripte innerhalb des DataModel Sub树s ausführen können. Es bietet eine bessere Kontrolle über Erlebnis-Skripte, anstatt ein "alles oder nichts"-System zu sein, bei dem jedes Skript tun kann, was andere Skripte tun können.
- Dieses System ermöglicht es Ihnen, zu begrenzen, was Modelle aus der Toolbox tun können, und macht es einfacher, benutzergenerierte Inhalte in das Erlebnis einzubauen, auch die, die Skripte enthalten.
- Es kann auch helfen, die bessere Sicherheit von Erlebnissen zu gewährleisten, die es den Spielern ermöglichen, ihren eigenen Codesauszuführen, was oft in einem eingeschränkten oder emulierten Umgebung ausgeführt wird.
- Es kann auch verwendet werden, um Bibliotheken zu teilen, die begrenzen, was sie selbst tun können. Zum Beispiel kann eine Bibliothek, die zusätzliche Mathe- Methoden bietet, auf das kleinste Set von Fähigkeiten beschränkt werden, damit andere Entwickler, die diese Bibliothek verwenden, nicht die gesamte Code-Basis überprüfen müssen, um sicherzustellen, dass keine bösartigen Codes enthalten sind.
Skript-Fähigkeiten aktivieren
Um diese Funktion zu aktivieren, ändere die SandboxedInstanceMode Einstellung von Default zu Experimental im Explorer.
Wenn der Client-Beta-Test abgeschlossen ist, ist dieses Schritt nicht mehr erforderlich.
Sandbox-Container
Dieses System führt ein Konzept eines gesandten Containers ein. Eine Instanz von Typ Model , Folder , 1> Class.Script1> oder Nachkommen von einem dieser Klassen haben ein 4> Class.Instance.Sandboxed|Sandboxed</
Das Aktivieren der Sandboxed Eigenschaft markiert die Instanz als Sandbox-Container innerhalb des DataModel-Baums, was die Aktionen beschränkt, die die Skripte innerhalb dieser Instanz basierend auf dem Set von Werten in der Class.Instance.Capilities|CapilitiesEigenschaftenausführen können.
Fähigkeiten
Die Capabilities-Eigenschaft ist eine Reihe von Werten, die verschiedene Aspekte der Ausführung steuern, in vier Gruppen unterteilt:
- Ausführungssteuerung - Gibt an, ob ein Skript auf dem Client oder Server ausgeführt werden kann
- Zugriffskontrolle auf die Instanz - gibt an, mit welchen DataModel -Teilen ein Skript interagieren kann
- Skriptfunktionssteuerung - Gibt an, welche Luau-Funktionsskripte aufgerufen werden können
- Engine-API-Zugriffskontrolle - Spezifiziert, welche Teile der Roblox-Engine-API verwendet werden können
Wenn ein Skript versucht, eine Aktion auszuführen, die nicht in der Reihe von Fähigkeiten für den aktuellen Ausführungsstaat ist, wird ein Fehler gemeldet. Fehler enthalten normalerweise die Aktion, das Ziel einer Actionund die erste Fähigkeit, die fehlt, z. B.:
The current thread cannot modify 'Workspace' (lacking capability AccessOutsideWrite)The current thread cannot call 'Clone' (lacking capability CreateInstances)The current thread cannot call 'GetSecret' (lacking capability Network)
Ausführungssteuerung
Dieses Set enthält zwei Fähigkeiten:
- RunClientScript - LocalScript oder Script mit einem Wert von 0> Class.BaseScript.RunContext|RunContext0> auf dem Client ist erlaubt, ausgeführt zu werden
Wenn das Skript Enabled ist, aber die Fähigkeit, die in dem Zusammenhang mit dem Startort, in dem es startet, nicht verfügbar ist, wird eine Warnung in dem Ausgabe-Fenster angezeigt. Wenn ein Skript nicht in diesem Kontext ausgeführt werden sollte, deaktivieren oder löschen Sie es.
Beachten Sie, dass ModuleScripts nicht erforderlich sind, um diese Ausführungsfunktionen zu haben.
Wenn ein Skript nicht starten kann, weil die Fähigkeit zur Ausführungssteuerung fehlt, wird dies in der Ausgabe als Warnung gemeldet, z. B.:
Cannot start server script 'Script' (lacking capability RunServerScript)
Instanz-Zugriffskontrolle
Dieses Set enthält nur eine einzige Fähigkeit:
- Zugriff auf außerhalb Schreiben - Skript ist erlaubt, Instanzen von außerhalb des Sandbox-Containers zu erhalten und zu empfangen
Wenn die Fähigkeit nicht verfügbar ist, kann das Skript nur auf Instanzen zugreifen, die in seinem eigenen Sandbox-Container sind. Zum Beispiel, wenn das Skript direkt in den Sandbox-Container platziert wird, gibt script.Parent.Parent``nil zurück.
Darüber hinaus, jedes Roblox-API-Ereignis, das in einem Instance stattfindet, wird in einem nil für jeden Instance außerhalb der Sandbox-Container empfangen. Zum Beispiel, wenn das 2> Class.BasePart.Touched2> durch einen Berühr
Vermeiden Sie die Einstellung dieser Fähigkeit; Sandboxing-Garantien sind schwächer, wenn Skripte mit einer Instanz in einem Erlebnis interagieren können.
Zugang zu Diensten
Selbst ohne Zugriff auf Schreiben außerhalb des Containers kann sich Skripte in der Sandbox-Container immer noch auf Spiel , workspace und Dienste zugreifen. Dieser Zugriff wird bereitgestellt, damit Skripte immer noch nützliche Methoden dieser Globals aufrufen können, wie 2> Class.DataModel.GetService2>, aber der Zugriff auf ihre Kind-Instanzen wird immer noch
Internamente durchgegebene Instanzen
Wenn eine Instanz durch eine Funktionsaufrufe durchgeht, die nicht durch Roblox-APIs gehen, wird die Referenz gespeichert. Wenn jedoch ein ModuleScript durch diese Weise übergeben wird, kann es nicht ohne AccessOutsideWrite benötigt werden. Dies ist, da die Rückgabe des ModuleScript oft mutabel ist und von einem Skript in einem Sandbox-Container modifiziert werden kann
Skript-Funktionalitätssteuerung
Dieses Set von Fähigkeitensteuere einige allgemeine Aspekte von Skripten:
- AssetRequire - Skript darf require mit einer Asset-ID aufrufen
- LoadString - Skript ist erlaubt, loadstring aufzurufen
- CreateInstances - Skript kann neue Instanzen mit Instance.new , Instance.fromExisting oder 0> Class.Instance:Clone0> erstellen
Beachten Sie, dass Standardfunktions Einschränkungen immer noch anzuwenden sind. Selbst wenn LoadString aktiviert ist, muss die Erfahrung immer noch in ServerScriptService aktivieren, und sie ist immer noch nur auf dem Server verfügbar.
Um neue Instanzen zu erstellen, neben CreateInstances , eine zusätzliche Engine-API-Fähigkeit, die Zugriff auf diese Instanz bietet, ist erforderlich.
Engine-API-Zugriffskontrolle
Diese letzte Gruppe von Fähigkeiten steuert den Zugriff auf verschiedene Engine-APIs:
- Einfach - Zugriff auf einfache Instanzen und notwendige Bausteine
- Audio - Zugriff auf Instanzen, die mit Audio-APIs verwandt sind
- Datenspeicher - Zugriff auf Dateispeicher- und Erinnerungsspeicher-APIs
- Netzwerk - Zugriff auf HTTP-Netzwerk-APIs
- Physik - Zugriff auf Instanzen, die mit der Physik verwandt sind
- UI - Zugriff auf Instanzen, die mit Benutzeroberflächen verwandt sind
- CSG : Zugriff auf Instanzen und Funktionen, die mit konstruktiver Solid Geometrie (CSG) verwandten sind
- Chat : Zugriff auf Instanzen, die mit dem In-Experience-Chat verwandt sind
- Animation : Zugriff auf Instanzen, die mit Animationen verwandt sind
- Avatar : Zugriff auf Instanzen, die mit Avataren verwandt sind
- Eingabe : Zugriff auf Instanzen, die mit der Eingabe des Benutzers verwandt sind
- Umgebung : Zugriff auf Instanzen, die mit der Kontrolle der Umgebung angezeigt werden
- RemoteEvent : Zugriff auf Instanzen für interne Netzwerk操作en
Es gibt auch Instanzen, die ohne die Fähigkeit verfügbar sind, die Skripte auszuführen. Dies umfasst die folgenden HttpService Methoden:
Wenn ein Instanz属ribut oder eine Methode ohne erforderliche Fähigkeit aufgerufen wird, wird ein Fehler berichtigt, der die fehlende Fähigkeit beschreibt.
Schließlich umfassen Fähigkeiten nicht jede Instanz in der Roblox-Engine heute. Instanzen, die nicht in dieser Sektion oder der folgenden aufgeführt sind, sind nicht für die Interaktion aus einem sandboxed Container und werfen einen Fehler ab, der sagt, dass eine zugewiesene Fähigkeit nicht für das aktuelle Skript, das. PL: die Skriptsverfügbar ist.
Eine zusätzliche Einschränkung ist, dass getfenv und setfenv Funktionen für Skripte in einem Sandbox-Container nicht verfügbar sind.
Der Zugriff auf Skripte auf Instanzen ist begrenzt. Die Instanzen selbst können immer noch existieren und von sich selbst in einem sandboxed Container operieren. Die Lichter leuchten immer noch, Benutzeroberflächen sind immer noch sichtbar und Audio-Einstellungen, die bereits mit einem Kabel verbunden sind, spielen immer noch Sounds ab.
Engine-API-Kapazitätszuweisungen
Hier ist die Liste der Instanzen und Methoden (wenn anders als die Instanzfähigkeit) für jede Engine-API-Fähigkeit:
Basis * Attachment
- Class.Part , MeshPart , CornerWedgePart , 0> Class.TriangleMeshPart0> , 3> Class.TrussPart3> , Part6>
Audio * AudioAnalyzer ,
Datenspeicher * DataStore , OrderedDataStore , GlobalDataStore
- Class.DataStoreGetOptions , DataStoreIncrementOptions , DataStoreInfo , 0> Class.DataStoreKey0> , DataStoreGetOptions3> , 6> Class.DataStoreObjektVersionInfo
Netzwerk * Class.HttpService:GetAsync , HttpService:RequestAsync() , HttpService:PostAsync() , 0> Class.HttpService:UrlEncode0> , HttpService:GetAsync()3>
Physik * AlignOrientation , AlignPosition , DynamicRotate
UI-Benutzeroberfläche * BasePlayerGui , PlayerGui , BillboardGui , 0> Class.GuiBase0> ,
- Class.Toolbar , TextButton , TextFilterResult , 0> Class.TextFilterTranslatedResult0> , 3> Class.TextLabel3> , 6> Class.TextService6> , TextBox9>
CSG * GeometryService
- BasePart Methoden: BasePart:IntersectAsync() , BasePart:SubtractAsync() , 0> Class.BasePart:UnionAsync0>
- Class.IntersectOperation (benötigt auch Basic ), NegateOperation (benötigt auch 0> Basic0>), 3> Class.PartOperation3> (benötigt auch 6> Basic6>), IntersectOperation9> (benötigt auch IntersectOperation2>), 6>
Chat * BubbleChatConfiguration , BubbleChatMessageProperties
- Class.TextChannel , TextChatCommand , TextChatConfigurations , 0> Class.TextChatMessage0> , 3> Class.TextChatMessageProperties3> , 6> Class.TextChatService6> , TextChannel9>
Animation * Bone (benötigt auch Basic )
- Class.Animation , AnimationClip , AnimationClipProvider , 0> Class.AnimationContainer0> , 3> Class.AnimationRigData3> , 6> Class.AnimationTrack6> , Animation9>
Avatar * Accessory , AccessoryDescription
Umgebung * Atmosphere , Clouds , Lighting , 0> Class.Sky0>
- Class.BloomEffect , BlurEffect , ColorCorrectionEffect , 0> Class.ColorGradingEffect0> , 3> Class.DepthOfFieldEffect3> , 6> Class.PostEffect6> , BloomEffect9>
Remote-Ereignis- * BaseRemoteEvent , RemoteEvent , UnreliableRemoteEvent
Interaktionen zwischen Containern
Versteckte Container
Wenn ein Sandbox-Container in einem anderen Container verschachtelt wird, haben die Instanzen des inneren Containers Zugriff auf den äußeren Container.
Die Fähigkeiten des inneren Containers sind auf die Fähigkeiten des äußeren Containers begrenzt. Zum Beispiel, wenn der äußere Container Fähigkeiten von Einfach, Audio und CSG hat, während der innerer Container 2>Einfach2> und 5>Netzwerk5> hat, nur 8>Einfach8>-Fähigkeiten sind zur Verfügung des inner
Wenn es keine Fähigkeiten zwischen dem Inneren und dem Außerem Container gibt, ist das zugehörige Fähigkeitsset leer.
Bindbare Funktionen und Ereignisse
BindableEvent und BindableFunction bieten den besten Weg, um mit dem Container zu kommunizieren, oder ermöglichen es, Rückrufe mit Fähigkeiten zu verwalten, die nicht direkt verwendet werden dürfen.
Wenn ein Ereignis oder eine Funktion ausgeführt wird, werden Verbindungen im Kontext der Funktion ausgeführt, die sie registriert hat. Dies bedeutet, dass, wenn das Ereignis oder die Funktion-Callback durch den Sandbox-Container registriert wird, es mit den Fähigkeiten des Containers aufgerufen wird. Wenn das Ereignis oder die Funktion-Callback durch den Code außerhalb ausgeführt wird, wenn Sandbox-Container-Skripte sie aufrufen, wird Ihre Funktionen mit Fähigkeiten, die Ihren Funktionen zur Verfügung
Es ist wichtig zu beachten, dass selbst mit der AccessOutsideWrite Fähigkeit, Skripte in Sandbox-Containern können keine Ereignisse oder Funktionen außerhalb ihrer Container aufrufen, wenn sie ein größeres Kapazitätsset als das Container selbst haben.
Module-Anforderung
Inner ModuleScripts kann wie üblich durch den sandboxed-Container benötigt werden. Wenn die Ziel-Instanz jedoch außerhalb des Containers ist, kann der ModuleScript nur benötigt werden, wenn die Fähigkeitenset, die verfügbar ist, kleiner oder gleich ist wie die Fähigkeiten, die dem Container verfügbar sind.
Diese Einschränkung gilt nicht für RunClientScript und RunServerScript Fähigkeiten. Wenn der ModuleScript in einem Container mit nur 1> RunClientScript1> platziert wird, aber von einem Skript mit der Fähigkeit 4> RunServerScript 4> erforderlich ist, wird auf dem Server diese Funktionen aufgeführt und ausgeführt.
Direkt aufgerufene Funktionen
Wenn ein ModuleScript in einem sandboxed-Container von außerhalb des Containers erforderlich ist, sind einige der Schutzvorrichtungen nicht verfügbar. Insbesondere die Zielfunktion ist in der Lage, auf alle verfügbaren Instanzen zuzugreifen. Wenn der Client nicht in einem sandboxed-Container ist, handelt der Aufruf so, als ob Zugriff auf Außerhalb Schreiben verfügbar ist.
Andere Fähigkeiten Einschränkungen gelten immer noch. Wenn Sie eine Datenspeicher -Zugriff haben, aber das Ziel-Modul nicht, ist es nicht in der Lage, DataStore -M Methoden aufzurufen. jedoch, wenn Sie Ihre eigene Funktion mit DataStore -Betrieb, können Sie den Thread
Instanzen können an das Ziel-Modul übergeben oder an die Modul-Felder zugewiesen werden.
Wenn erforderlich, wird empfohlen, die Tabellementen mit rawset zuzuweisen, um zu vermeiden, dass __index / __newindex-Metam Methods auf der Tabelle gesetzt werden, die möglicherweise auf der Tabelle gesetzt werden.
Die allgemeine Empfehlung ist es, mit BindableEvent und BindableFunction zu kommunizieren, wann immer möglich.
Bewegen von Instanzen
Die meisten Instanzen haben keine Einschränkungen bei der Bewegung zwischen Containern. Script-Instanzen können jedoch nur in einen Container verschoben werden, der die gleichen Fähigkeiten oder ein Unterset von diesen Fähigkeiten hat.
Dies bedeutet, dass der mit AccessOutsideWrite versehene Sandbox-Container keinen Skript innerhalb seines Skripts einfach außerhalb übergehen kann, um mehr Fähigkeiten zu erhalten.