Kemampuan skrip adalah sistem yang menawarkan kontrol atas tindakan yang dapat dilakukan oleh skrip di dalam subtree DataModel.Ini memberikan kontrol yang lebih baik atas skrip pengalaman daripada menjadi sistem "semua atau tidak ada" di mana skrip lain dapat melakukan apa pun yang dapat dilakukan oleh skrip lain.
- Sistem ini memungkinkan Anda membatasi apa yang bisa dilakukan model yang diambil dari toolbox dan memudahkan untuk menyertakan konten yang dihasilkan pengguna di dalam pengalaman, bahkan yang berisi skrip.
- Ini juga dapat membantu memastikan keamanan pengalaman yang lebih baik yang memungkinkan pemain menjalankan kode mereka sendiri, yang sering dieksekusi di lingkungan terbatas atau diemulasi.
- Ini juga dapat digunakan untuk berbagi perpustakaan yang membatasi apa yang dapat mereka lakukan sendiri.Sebagai contoh, perpustakaan yang menyediakan metode matematika tambahan dapat dibatasi ke set kemampuan terkecil yang dibutuhkannya sehingga pengembang lain yang menggunakan perpustakaan tersebut tidak perlu memeriksa seluruh kode untuk memastikan tidak ada kode berbahaya.
Aktifkan kemampuan skrip
Untuk mengaktifkan fitur ini, ubah pengaturan SandboxedInstanceMode dari Default ke Experimental di Explorer.
Ketika tes beta klien selesai, langkah ini tidak lagi diperlukan.
Wadah terkotak pasir
Sistem ini memperkenalkan konsep kontainer berkotak pasir .Instansi dari jenis Model , Folder , Script , atau keturunan dari kelas mana pun memiliki properti Sandboxed yang tersedia di jendela Studio Properti , di bawah bagian Izin .

Mengaktifkan desain properti Sandboxed menunjukkan instansi sebagai wadah berpasir di dalam pohon DataModel yang membatasi tindakan yang dapat dilakukan oleh skrip di dalam kontainer itu berdasarkan set nilai di properti Capabilities.
Kemampuan
Properti Capabilities adalah kumpulan nilai yang mengontrol berbagai aspek eksekusi, dibagi menjadi empat kelompok:
- Kontrol eksekusi - Menyatakan apakah skrip dapat dijalankan pada klien atau server
- Kontrol akses instansi - Menyebutkan bagian mana DataModel skrip dapat berinteraksi
- Kontrol fungsi skrip - Menyebutkan skrip fungsi Luau mana yang dapat dipanggil
- Kontrol akses API mesin - Menyebutkan bagian mana dari API mesin Roblox yang dapat digunakan
Ketika skrip mencoba melakukan tindakan yang tidak ada dalam set kemampuan untuk status eksekusi saat ini, sebuah kesalahan dilaporkan.Kesalahan biasanya termasuk tindakan yang dicoba, target action, dan kemampuan pertama yang hilang, misalnya:
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)
Kontrol eksekusi
Set ini mencakup dua kemampuan:
- RunClientScript - LocalScript atau Script dengan nilai RunContext dari Client diizinkan untuk dieksekusi pada klien
Jika skrip adalah Enabled , tetapi kemampuan yang sesuai dengan lokasi yang ingin dimulai tidak tersedia, pesan peringatan ditampilkan di jendela Output .Jika skrip tidak seharusnya dijalankan dalam konteks itu, nonaktifkan atau hapusnya.
Perhatikan bahwa ModuleScripts tidak diperlukan untuk memiliki kemampuan eksekusi ini yang diperlukan.
Ketika skrip gagal dimulai karena kemampuan kontrol eksekusi hilang, dilaporkan sebagai peringatan dalam output, misalnya:
Cannot start server script 'Script' (lacking capability RunServerScript)
Kontrol akses instansi
Set ini hanya mencakup satu kemampuan:
- Akses Luar Tertulis - Skrip diizinkan untuk mengambil dan menerima instansi dari luar kontainer sandbox
Ketika kemampuan tidak tersedia, skrip hanya dapat mencari instansi yang berada di dalam kontainer sandbox sendiri.Sebagai contoh, jika skrip ditempatkan langsung di kontainer sandbox, script.Parent.Parent kembalikan nil .
Selain itu, setiap peristiwa API Roblox yang melewati dalam Instance tidak lulus dalam nil untuk setiap Instance di luar kontainer sandbox.Sebagai contoh, jika BasePart.Touched diberi sinyal oleh sentuhan dari instansi di luar kontainer sandbox, acara masih diterima, tetapi argumennya adalah nil .
Hindari mengatur kemampuan ini; jaminan sandbox lebih lemah ketika skrip dapat berinteraksi dengan instance apa pun dalam pengalaman.
Akses ke layanan
Bahkan tanpa Akses Luar Tertulis , skrip di kontainer sandbox masih bisa mengakses game , workspace , dan layanan.Akses ini disediakan agar skrip masih dapat memanggil metode berguna dari global tersebut, seperti DataModel.GetService , tetapi akses ke instans anak mereka masih diuji.
Instansi yang disampaikan secara internal
Jika instansi dilewati melalui panggilan fungsi yang tidak melalui API Roblox, referensi dipertahankan.Namun, jika ModuleScript dilewati dengan cara ini, itu tidak bisa diperlukan tanpa Akses Luar Tertulis .Ini karena pengembalian dari ModuleScript sering dapat diubah dan dapat dimodifikasi oleh skrip di wadah berpasir.
Kontrol fungsi skrip
Set kemampuan ini mengontrol beberapa aspek umum dari skrip:
- Persyaratan Aset - Skrip diizinkan untuk memanggil require dengan ID aset
- Memuat String - Skrip diizinkan untuk dipanggil loadstring
- Buat Instansi - Skrip dapat membuat instans baru menggunakan Instance.new , Instance.fromExisting , atau Instance:Clone()
Ingat bahwa batasan fungsi default masih berlaku.Bahkan jika LoadString diaktifkan, pengalaman masih harus mengaktifkannya di ServerScriptService , dan masih hanya tersedia di server.
Untuk membuat instans baru, selain dari Membuat Instansi , diperlukan kemampuan API Mesin tambahan yang memberikan akses ke instans itu.
Kontrol akses API mesin
Kelompok kemampuan terakhir ini mengontrol akses skrip ke berbagai API Engine:
- Dasar - Akses ke instans sederhana dan blok bangunan penting
- Audio - Akses ke instans yang terkait dengan API audio
- Penyimpan Data - Akses ke API penyimpanan data dan memori
- Jaringan - Akses ke API jaringan HTTP
- Fisika - Akses ke instans yang terkait dengan fisika
- UI - Akses ke instans yang terkait dengan antarmuka pengguna
- CSG : akses ke instans dan fungsi yang terkait dengan geometri padat konstruktif (CSG)
- Obrolan : akses ke instans yang terkait dengan obrolan dalam pengalaman
- Animasi : akses ke instans yang terkait dengan animasi
- Avatar : akses ke instansi yang terkait dengan avatar
- Input : akses ke instans yang terkait dengan input pengguna
- Lingkungan : akses ke instans yang terkait dengan kontrol bagaimana lingkungan ditampilkan
- Peristiwa Remote : akses ke instans untuk operasi jaringan internal
Ada juga instansi yang tersedia tanpa kemampuan selain dari kemampuan untuk mengeksekusi skrip.Ini termasuk metode berikut HttpService :
Jika properti atau metode instansi diakses tanpa kemampuan yang diperlukan, kesalahan dilaporkan yang menggambarkan kemampuan yang hilang.
Akhirnya, kemampuan tidak mencakup setiap instansi di Roblox Engine hari ini.Instansi yang tidak terdaftar di bagian ini atau berikutnya tidak tersedia untuk interaksi dari kontainer sandbox dan melempar kesalahan yang mengatakan bahwa kemampuan tidak ditugaskan tidak tersedia untuk skrip saat ini.
Keterbatasan tambahan adalah bahwa getfenv dan setfenv fungsi tidak tersedia untuk skrip di kontainer berpasir.
Akses skrip hanya ke instansi terbatas.Instansi itu sendiri masih bisa ada dan beroperasi sendiri di dalam wadah berpasir.Lampu masih bersinar, antarmuka pengguna masih terlihat, dan pengaturan audio yang sudah terhubung masih memainkan suara.
Asignasi kemampuan API mesin
Berikut adalah daftar instans dan metode (jika berbeda dari kemampuan instance) untuk setiap kemampuan API Mesin:
Dasar * Attachment
Toko Data * DataStore , OrderedDataStore , GlobalDataStore
Fisika * 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 (juga membutuhkan Dasar ), NegateOperation (juga membutuhkan Dasar ), PartOperation (juga membutuhkan Dasar ), UnionOperation (juga membutuhkan Dasar )
Obrolan * BubbleChatConfiguration , BubbleChatMessageProperties
Animasi * Bone (juga membutuhkan Dasar )
Lingkungan * Atmosphere , Clouds , Lighting , Sky
Acara Jarak Jauh * BaseRemoteEvent , RemoteEvent , UnreliableRemoteEvent
Interaksi antara kontainer
Wadah terpisah
Ketika satu kontainer sandbox ternester di dalam kontainer lain, instansi kontainer internal dapat diakses ke kontainer luar.
Kemampuan wadah internal dibatasi oleh kemampuan wadah luar.Sebagai contoh, jika wadah luar memiliki kemampuan Dasar , Audio dan CSG , sementara wadah dalam memiliki Dasar dan Jaringan , hanya kemampuan Dasar yang tersedia untuk wadah dalam saat menjalankan.
Jika tidak ada kemampuan bersama di antara wadah dalam dan luar, set kemampuan yang dihasilkan kosong.
Fungsi dan peristiwa yang dapat diikat
BindableEvent dan BindableFunction memberikan cara terbaik untuk berkomunikasi dengan kontainer atau memungkinkannya menjalankan panggilan balik dengan kemampuan yang tidak diizinkan untuk digunakan langsung.
Ketika sebuah acara atau fungsi diaktifkan, koneksi dieksekusi dalam konteks fungsi yang mendaftarkannnya.Ini berarti bahwa jika event atau fungsi panggil balik terdaftar oleh kontainer sandbox, itu dipanggil dengan kemampuan kontainer itu.Jika panggil balik terdaftar oleh kode di luar, ketika skrip kontainer sandbox memanggilnya, mereka mengeksekusi fungsi Anda dengan kemampuan yang tersedia untuk fungsi Anda.
Penting untuk dicatat bahwa bahkan dengan kemampuan Akses Luar Tertulis , skrip di kontainer sandbox tidak dapat memanggil acara atau fungsi di luar kontainer mereka jika mereka memiliki set kemampuan yang lebih besar daripada kontainer itu sendiri.
Module mensyaratkan/mengharuskan
Inner ModuleScripts dapat diperlukan oleh kontainer sandbox seperti biasa.Namun, jika instansi target berada di luar kontainer, ModuleScript hanya dapat diperlukan jika set kemampuan yang tersedia untuknya lebih kecil atau sama dengan kemampuan yang tersedia untuk kontainer.
Keterbatasan ini tidak berlaku untuk RunClientScript dan RunServerScript kemampuan.Jika ModuleScript ditempatkan di dalam wadah dengan hanya RunClientScript tetapi diperlukan dari skrip yang memiliki kemampuan RunServerScript , diizinkan untuk berhasil dan menjalankan fungsi-fungsi tersebut di server.
Fungsi yang dipanggil langsung
Jika ModuleScript dalam wadah berpasir diperlukan dari luar kontainer, beberapa perlindungan tidak tersedia.Secara khusus, fungsi target dapat mengakses semua instans yang tersedia untuk panggilan.Jika panggilan tidak berada di kontainer sandbox, panggilan berfungsi seolah-olah Akses Luar Tertulis tersedia untuknya.
Batasan kemampuan lain masih berlaku.Jika Anda memiliki kemampuan akses DataStore , tetapi modul target tidak, ia tidak dapat memanggil metode DataStore.Namun, jika Anda melewati fungsi sendiri yang bekerja dengan DataStore, target dapat menjalankannya selama panggilan itu.Jika target menjadwalkan thread menggunakan metode seperti dari task , thread tersebut kehilangan kemampuan untuk memanggil fungsi itu.
Instans dapat dikirim ke modul target atau ditugaskan ke bidang modul.
Jika diperlukan, disarankan untuk menugaskan anggota tabel menggunakan rawset untuk menghindari menjalankan __index / __newindex metode metode yang mungkin ditetapkan di tabel.
Rekomendasi keseluruhan adalah untuk berkomunikasi dengan BindableEvent dan BindableFunction kapan pun dimungkinkan.
Gerakan instansi
Sebagian besar instans tidak memiliki batasan pada gerakan antara kontainer.Namun, instansi skrip hanya dapat dipindahkan ke dalam wadah yang memiliki set kemampuan yang sama atau sebagian dari kemampuan tersebut.
Ini berarti bahwa kontainer sandbox dengan Akses Luar Tertulis tidak dapat hanya memindahkan kembali skrip di dalam dirinya sendiri ke luar dan mendapatkan lebih banyak kemampuan.