Możliwości skryptów to system oferujący kontrolę nad działaniami, które skrypty mogą wykonywać w poddrzewiu DataModel.Zapewnia lepszą kontrolę nad skryptami doświadczenia, zamiast być systemem "wszystko lub nic", w którym każdy skrypt może zrobić wszystko, co mogą zrobić inne skrypty.
- Ten system pozwala ci ograniczyć, co modele z pudełka z narzędziami mogą zrobić, i ułatwia włączanie generowanej przez użytkownika zawartości do doświadczenia, nawet tych, które zawierają skrypty.
- Może to również pomóc zapewnić lepsze bezpieczeństwo doświadczeń, które pozwalają graczom uruchamiać własny kod, który często jest wykonywany w ograniczonej lub emulowanej środowisko.
- Można go również używać do udostępniania bibliotek, które ograniczają to, co mogą zrobić samodzielnie.Na przykład, biblioteka dostarczająca dodatkowe metody matematyczne może być ograniczona do najmniejszego zestawu zdolności, których potrzebuje, aby inni programiści korzystający z tej biblioteki nie musieli weryfikować całego kodu, aby upewnić się, że nie zawiera on złośliwego kodu.
Włącz możliwości skryptów
Aby włączyć tę funkcja, zmień ustawienie SandboxedInstanceMode z Default na Experimental w Explorerze.
Gdy test beta klienta zostanie zakończony, ten krok nie będzie już wymagany.
Sandboxowany kontener
Ten system wprowadza koncepcję kontenera piaskownicy .Instancja typu Model , Folder , Script lub potomkowie dowolnej z tych klas mają dostępną właściwość Sandboxed w oknie Studio Właściwości , w sekcji Uprawnienia .

Włączenie właściwości Sandboxed oznacza, że instancja jest oznaczona jako zamknięty kontener w drzewie DataModel, co ogranicza działania, które skrypty w tej właściwości mogą wykonać w oparciu o zestaw wartości w właściwości Capabilities.
Zdolności
Właściwość Capabilities jest zbiorem wartości, które kontrolują różne aspekty wykonania, podzielone na cztery grupy:
- Kontrola wykonania - Określa, czy skrypt może uruchomić się na klientzie lub serwerze
- Kontrola dostępu do instancji - Określa, z jakimi częściami skrypt może wchodzić w interakcję
- Kontrola funkcjonalności skryptu - Określa, które skrypty funkcji Luau mogą wezwać
- Kontrola dostępu do API silnika - Określa, które części silnika API Roblox mogą być używane
Kiedy skrypt próbuje wykonać działanie, które nie znajduje się w zestawie możliwości dla obecnego stanu wykonania, zgłaszany jest błąd.Błędy zwykle obejmują wykonywaną akcję, cel akcji i pierwszą niedostępną zdolność, na przykład:
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)
Kontrola wykonania
Zestaw ten obejmuje dwie możliwości:
- RunClientScript - lub z wartością jest dozwolone wykonanie na klientzie
- RunServerScript - Script z wartością Class.BaseScript.RunContext|RunContext``Enum.RunContext.Server|Server jest dozwolone wykonanie na serwerze
Jeśli skrypt jest Enabled, ale zdolność odpowiadająca lokalizacji, w której próbuje się uruchomić, nie jest dostępna, ostrzeżenie jest wyświetlane w oknie Wyjście .Jeśli skrypt nie miał być uruchamiany w tym kontekście, wyłącz go lub usuń.
Zauważ, że ModuleScripts nie są wymagane, aby te możliwości wykonania były wymagane.
Gdy skrypt nie uruchomi się, ponieważ brakuje funkcjonalności kontroli wykonania, zostanie to zgłoszone jako ostrzeżenie w wyniku, na przykład:
Cannot start server script 'Script' (lacking capability RunServerScript)
Kontrola dostępu do instancji
Ten zestaw obejmuje tylko jedną zdolność:
- Dostęp na zewnątrz pisania - Skrypt może pobierać i otrzymywać instancje z zewnątrz kontenera piaskownicy
Gdy funkcjonalność nie jest dostępna, skrypt może wyszukiwać tylko instancje znajdujące się w swoim własnym zamkniętym kontenerze.Na przykład, jeśli skrypt zostanie umieszczony bezpośrednio w skrzyni piaskowej, script.Parent.Parent zwraca nil .
Ponadto każde wydarzenie API Roblox, które przechodzi w zamiast przechodzić w poza sandboxowanym kontenerem.Na przykład, jeśli BasePart.Touched jest sygnalizowany przez dotknięcie z instancji poza kontenerem piaskownicy, wydarzenie jest nadal otrzymywane, ale argument jest nil .
Unikaj ustawiania tej funkcjonalności; gwarancje piaskownicy są słabsze, gdy skrypty mogą wchodzić w interakcję z dowolną instancją w doświadczeniu.
Dostęp do usług
Nawet bez AccessOutsideWrite skrypty w pojemniku piaskownicy nadal mogą uzyskiwać dostęp do game , workspace i usług.Dostęp ten jest zapewniony, aby skrypty mogły nadal wzywać przydatne metody tych globali, takie jak DataModel.GetService, ale dostęp do ich instancji dzieci nadal jest weryfikowany.
Przekazywane wewnętrznie instancje
Jeśli instancja jest przekazywana za pomocą wezwania funkcji, które nie przechodzą przez interfejsy API Roblox, odniesienie jest zachowywane.Jeśli jednak ModuleScript zostanie przekazane w ten sposób, nie może być wymagane bez AccessOutsideWrite .Dzieje się tak, ponieważ powrót z ModuleScript jest często zmienny i może być modyfikowany przez skrypt w pojemniku piaskownicy.
Kontrola funkcjonalności skryptu
Ten zestaw funkcji kontroluje niektóre ogólne aspekty skryptów:
- Wymagania dotyczące zasobów - Skrypt może wezwać require z ID zasobu
- LoadString - Skrypt może wezwać loadstring
- Twórz instancje - Skrypt może tworzyć nowe instancje za pomocą Instance.new, Instance.fromExisting lub Instance:Clone()
Pamiętaj, że nadal obowiązują ograniczenia funkcji domyślnych.Nawet jeśli Ładowanie ciągu znaków jest włączone, doświadczenie nadal musi włączyć go w ServerScriptService, a jest dostępne tylko na serwerze.
Aby utworzyć nowe instancje, oprócz tworzenia instancji wymagana jest dodatkowa zdolność API silnika zapewniająca dostęp do tej instancji.
Kontrola dostępu API silnika
Ostatnia grupa zdolności kontroluje dostęp do skryptów do różnych interfejsów API silnika:
- Podstawowy - Dostęp do prostych instancji i niezbędnych bloków budowania
- Dźwięk - Dostęp do instancji związanych z interfejsami API audio
- Magazyn danych - Dostęp do API magazynu danych i pamięci
- Sieć - Dostęp do API sieci HTTP
- Fizyka - Dostęp do instancji związanych z fizyką
- Interfejs użytkownika - Dostęp do instancji związanych z interfejsami użytkownika
- CSG : dostęp do instancji i funkcji związanych z konstruktywną geometrią stałą (CSG)
- Czat : dostęp do instancji związanych z czatem w doświadczeniu
- Animacja : dostęp do instancji związanych z animacjami
- Avatar : dostęp do instancji związanych z awatarami
- Wejście : dostęp do instancji związanych z wejściem użytkownika
- Środowisko : dostęp do instancji związanych z kontrolą sposobu wyświetlania środowiska
- Wydarzenie zdalne : dostęp do instancji do operacji sieciowych wewnętrznych
Istnieją również przypadki, w których dostępne są funkcje poza możliwością wykonywania skryptów.Obejmują one następujące metody HttpService :
Jeśli właściwość lub metoda instancji jest dostępna bez wymaganej zdolności, zgłaszany jest błąd opisujący brakującą zdolność.
Wreszcie zdolności nie obejmują każdej instancji w Roblox Engine dzisiaj.Instancje nie wymienione w tej sekcji lub następnej nie są dostępne do interakcji z kontenerem piaskowym i rzucają błąd mówiący, że nie jest dostępna zdolność Nieprzydzielona , która nie jest dostępna dla obecnego skryptu.
Dodatkowym ograniczeniem jest to, że funkcje getfenv i setfenv nie są dostępne dla skryptów w pojemniku piaskownicy.
Dostęp tylko do skryptów do instancji jest ograniczony.Sami instancje mogą nadal istnieć i działać samodzielnie w ramach skrzynki piaskowej.Światła nadal świecą, interfejsy użytkownika są nadal widoczne, a ustawienia audio, które są już podłączone, odtwarzają dźwięki.
Przydziały zdolności API silnika
Oto lista instancji i metod (jeśli różnią się od zdolności instancji) dla każdej zdolności API silnika:
Podstawowy * Attachment
Sklep danych * DataStore , OrderedDataStore , GlobalDataStore
Fizyka * AlignOrientation , AlignPosition , DynamicRotate
UI * BasePlayerGui , PlayerGui , BillboardGui , GuiBase , GuiBase2d , GuiBase3d , LayerCollector , ScreenGui , SurfaceGui , SurfaceGuiBase , UIBase
- UIComponent , UICorner , UIDragDetector , UIFlexItem , UIGradient , UIGridLayout , UIGridStyleLayout , UILayout , UIListLayout , UIPadding , UIPageLayout , UIScale , UIStroke , UITableLayout
CSG * GeometryService
- IntersectOperation (wymaga również Podstawowe ), NegateOperation (wymaga również Podstawowe ), PartOperation (wymaga również Podstawowe ), UnionOperation (wymaga również Podstawowe )
Animacja * Bone (wymaga również Podstawowe )
Środowisko * Atmosphere , Clouds , Lighting , Sky
Wydarzenie zdalne * BaseRemoteEvent , RemoteEvent , UnreliableRemoteEvent
Interakcje między kontenerami
Zagniezione pojemniki
Kiedy jeden pojemnik z piaskownicą jest włożony do innego pojemnika, instancje wewnętrznego pojemnika są dostępne dla zewnętrznego pojemnika.
Możliwości wewnętrznego kontenera są ograniczone możliwościami zewnętrznego.Na przykład, jeśli zewnętrzny pojemnik ma funkcje Podstawowe , Dźwięk i CSG , podczas gdy wewnętrzny pojemnik ma Podstawowe i Sieć , tylko funkcje Podstawowe są dostępne dla wewnętrznego pojemnika podczas uruchamiania.
Jeśli nie ma wspólnych zdolności między wewnętrznym i zewnętrznym kontenerem, zestaw zdolności wynikowych jest pusty.
Funkcje i wydarzenia wiązalne
BindableEvent i BindableFunction zapewniają najlepszy sposób komunikacji z kontenerem lub pozwalają mu uruchamiać powiadomienia z funkcjami, których sam nie może używać bezpośrednio.
Gdy wydarzenie lub funkcja zostaną uruchomione, połączenia są wykonywane w kontekście funkcji, która je zarejestrowała.Oznacza to, że jeśli wezwanie zdarzenia lub funkcji jest rejestrowane przez skrzynię piaskową, jest wywoływane z możliwościami tej skrzyni.Jeśli powrót zostanie zarejestrowany przez kod poza sandboxem, gdy skrypty kontenera są wzywane, wykonują one funkcje z możliwościami dostępnymi dla twoich funkcji.
Ważne jest, aby zauważyć, że nawet przy możliwości Dostęp na zewnątrz pisania , skrypty w pojemnikach piaskownicy nie mogą wzywać wydarzeń lub funkcji poza swoimi pojemnikami, jeśli mają większy zestaw zdolności niż sam pojemnik.
Wymagany wymagać
Wewnętrzny ModuleScripts może być wymagany przez skrzynię piaskową jak zwykle.Jeśli jednak celowa instancja znajduje się poza kontenerem, wymóg ModuleScript może być wymagany tylko wtedy, gdy zestaw zdolności, który jest do niego dostępny, jest mniejszy lub równy dostępnym zdolnościom dla kontenera.
Ograniczenie to nie ma zastosowania do zdolności RunClientScript i RunServerScript .Jeśli ModuleScript zostanie umieszczony w pojemniku z tylko RunClientScript , ale jest wymagany z kodu, który ma możliwość RunServerScript , można go uruchomić i uruchomić te funkcje na serwerze.
Bezpośrednio nazywane funkcje
Jeśli wymagany jest ModuleScript w pojemniku zamkniętym w piaskownicy z zewnątrz pojemnika, niektóre z ochron nie są dostępne.W szczególności, funkcja docelowa jest w stanie uzyskać dostęp do wszystkich instancji dostępnych dla wezwającego.Jeśli wezwany nie jest w zamkniętym kontenerze, wezwanie działa tak, jakby AccessOutsideWrite był dostępny dla niego.
Nadal obowiązują ograniczenia zdolności inne.Jeśli masz możliwość dostępu do przechowywania danych DataStore , ale moduł docelowy jej nie ma, nie może wywołać metod DataStore.Jeśli jednak przekażesz własną funkcję pracującą z DataStore, cel może ją uruchomić podczas tego wezwania.Jeśli cel planuje wątek za pomocą metod takich jak z task, wątki te tracą zdolność do wezwania tej funkcji.
Instancje mogą być przekazane do celowego modułu lub przypisane do pól modułu.
Jeśli jest to wymagane, zaleca się przypisanie członków tabeli za pomocą rawset uniknąć uruchamiania __index / __newindex metametod, które mogą zostać ustawione na tabeli.
Ogólna rekomendacja jest komunikowanie się z BindableEvent i BindableFunction w każdym możliwym przypadku.
Przesuwanie instancji
Większość instancji nie ma ograniczeń w ruchu między kontenerami.Instancje skryptów mogą jednak być przeniesione tylko do kontenera, który ma ten sam zestaw funkcji lub podzbiór tych funkcji.
Oznacza to, że skrzynia piaskowa z AccessOutsideWrite nie może po prostu ponownie adoptować skryptu wewnątrz siebie na zewnątrz i uzyskać więcej możliwości.