Kemampuan Skrip

*Konten ini diterjemahkan menggunakan AI (Beta) dan mungkin mengandung kesalahan. Untuk melihat halaman ini dalam bahasa Inggris, klik di sini.

Kemampuan skrip memungkinkan Anda mengontrol tindakan apa yang dapat dilakukan skrip di dalam subpokok DataModel. Alih-alih sistem "semua atau tidak ada" standar, Anda dapat mengatur skrip hanya agar bisa mengakses kategori tertentu, seperti audio, fisika, penyimpanan data, dan lainnya.

  • Sistem ini memungkinkan Anda membatasi apa yang dapat dilakukan model yang diambil dari toolbox dan mempermudah untuk menyertakan konten yang dibuat pengguna di dalam game.
  • Ini juga dapat membantu memastikan keamanan permainan yang memungkinkan pemain menjalankan kode mereka sendiri, yang sering kali dieksekusi dalam lingkungan yang dibatasi atau disimulasikan.
  • Ini juga dapat digunakan untuk berbagi pustaka yang membatasi apa yang dapat mereka lakukan sendiri. Misalnya, sebuah pustaka yang menyediakan metode matematika tambahan dapat dibatasi pada serangkaian kemampuan terkecil yang dibutuhkan sehingga pengembang lain yang menggunakan pustaka tersebut tidak perlu memvalidasi seluruh basis kode untuk memastikan tidak ada kode berbahaya.

Mengaktifkan kemampuan skrip

Untuk mengaktifkan fitur ini, ubah properti SandboxedInstanceMode dari Default menjadi Experimental di jendela Explorer dan Properties.

Kontainer yang disandbox

Kemampuan skrip memperkenalkan konsep kontainer yang disandbox. Models, Folders, Scripts, atau keturunan dari kelas-kelas tersebut memiliki properti Sandboxed yang tersedia di jendela Properties.

Properti Sandbox dari Folder di jendela Properties.

Mengaktifkan properti Sandboxed menandakan bahwa instansi tersebut adalah kontainer yang disandbox di dalam pohon DataModel, yang membatasi tindakan yang dapat dilakukan skrip di dalam kontainer tersebut berdasarkan nilai yang ditetapkan dalam properti Capabilities.

Kemampuan

Properti Capabilities adalah sekumpulan nilai yang mengontrol berbagai aspek eksekusi. Kemampuan termasuk dalam kategori luas berikut:

  • Kontrol eksekusi - Menentukan apakah skrip dapat dijalankan di sisi klien atau server
  • Kontrol akses instansi - Menentukan bagian DataModel mana yang dapat diinteraksikan oleh skrip
  • Kontrol fungsionalitas skrip - Menentukan fungsi Luau mana yang dapat dipanggil oleh skrip
  • Kontrol akses API Engine - Menentukan bagian API Engine Roblox mana yang dapat digunakan

Ketika skrip mencoba melakukan tindakan yang tidak ada dalam sekumpulan kemampuan, Roblox melaporkan kesalahan. Kesalahan biasanya mencakup tindakan yang dicoba, target dari tindakan tersebut, dan kemampuan pertama yang hilang:


Thread saat ini tidak dapat mengubah 'Workspace' (kekurangan kemampuan AccessOutsideWrite)
Thread saat ini tidak dapat memanggil 'Clone' (kekurangan kemampuan CreateInstances)
Thread saat ini tidak dapat memanggil 'GetSecret' (kekurangan kemampuan Network)

Kontrol eksekusi

Dua kemampuan menangani kontrol eksekusi:

Jika skrip Enabled, tetapi kemampuan yang sesuai dengan lokasi tempat skrip mencoba untuk memulai tidak tersedia, pesan peringatan ditampilkan di jendela Output. Jika skrip tidak seharusnya dijalankan dalam konteks tersebut, nonaktifkan atau hapus skrip tersebut.

Perlu dicatat bahwa ModuleScripts tidak perlu memiliki kemampuan eksekusi ini untuk menjadi wajib.

Ketika sebuah skrip gagal untuk memulai karena kemampuan kontrol eksekusi yang hilang, itu dilaporkan sebagai peringatan di keluaran, misalnya:


Tidak dapat memulai skrip server 'Script' (kekurangan kemampuan RunServerScript)

Kontrol akses instansi

Sebuah kemampuan tunggal menangani kontrol akses instansi:

  • AccessOutsideWrite - Skrip diizinkan untuk mengambil dan menerima instansi dari luar kontainer yang disandbox

Ketika kemampuan ini tidak tersedia, skrip hanya dapat mencari instansi yang berada di dalam kontainer yang disandbox itu sendiri. Misalnya, jika skrip ditempatkan langsung di dalam kontainer yang disandbox, script.Parent.Parent mengembalikan nil.

Selain itu, setiap peristiwa API Roblox yang melewatkan Instance alih-alih melewatkan nil untuk setiap Instance di luar kontainer yang disandbox. Misalnya, jika BasePart.Touched diberi sinyal oleh sentuhan dari instansi di luar kontainer yang disandbox, peristiwa tetap diterima, tetapi argumennya adalah nil.

Hindari mengatur kemampuan ini; jaminan sandboxing lebih lemah ketika skrip dapat berinteraksi dengan instansi mana pun dalam sebuah game.

Akses ke layanan

Bahkan tanpa AccessOutsideWrite, skrip di kontainer yang disandbox masih dapat mengakses game, workspace, dan layanan. Akses ini diberikan agar skrip masih dapat memanggil metode berguna dari globals tersebut, seperti DataModel.GetService, tetapi akses ke instansi anak mereka masih divalidasi.

Instansi yang diteruskan secara internal

Jika sebuah instansi diteruskan melalui pemanggilan fungsi yang tidak melewati API Roblox, referensinya dipertahankan. Namun, jika sebuah ModuleScript diteruskan dengan cara ini, tidak dapat diharuskan tanpa AccessOutsideWrite. Ini karena kembalian dari ModuleScript sering kali dapat diubah dan dapat dimodifikasi oleh skrip di dalam kontainer yang disandbox.

Kontrol fungsionalitas skrip

Sekumpulan kemampuan ini mengontrol beberapa aspek umum dari skrip:

Perlu diingat bahwa pembatasan fungsi default masih berlaku. Bahkan jika LoadString diaktifkan, game harus tetap mengaktifkannya di ServerScriptService, dan itu masih hanya tersedia di server.

Untuk membuat instansi baru, selain CreateInstances, diperlukan tambahan kemampuan API Engine yang memberikan akses ke instansi tersebut.

Kontrol akses API Engine

Kelompok kemampuan terakhir ini mengontrol akses skrip ke berbagai API Engine:

  • Animation - Akses ke instansi terkait dengan animasi
  • AssetCreateUpdate - Akses ke API Engine terkait dengan membuat atau memperbarui aset
  • AssetManagement - Akses ke API Engine terkait dengan operasi pada aset yang tidak dibaca, dibuat, atau diperbarui
  • AssetRead - Akses ke API Engine terkait dengan mendapatkan informasi tentang aset
  • Audio - Akses ke instansi terkait dengan API audio
  • AvatarAppearance - Akses ke instansi terkait dengan elemen visual avatar
  • AvatarBehavior - Akses ke API Engine terkait dengan mengontrol atau memodifikasi humanoid
  • Basic - Akses ke API umum yang menawarkan risiko kecil
  • CSG - Akses ke instansi dan fungsi terkait dengan geometri padat konstruktif (CSG)
  • CapabilityControl - Akses untuk memodifikasi properti Sandboxed dan Capabilities dari instansi
  • Capture - Akses ke API Engine terkait dengan menangkap tangkapan layar atau video di layar pengguna
  • Chat - Akses ke instansi terkait dengan obrolan dalam game
  • Consequences - Akses ke API untuk menghukum pengguna (pengusiran atau larangan)
  • DataStore - Akses ke API penyimpanan data dan penyimpanan memori
  • DynamicGeneration - Akses ke API Engine terkait dengan memodifikasi aset secara dinamis
  • Environment - Akses ke instansi terkait dengan kontrol bagaimana lingkungan ditampilkan
  • Groups - Akses ke API Engine yang berhubungan dengan grup/komunitas
  • Input - Akses ke instansi terkait dengan input pengguna
  • LegacySound - Akses ke API Engine terkait dengan suara yang akan dihentikan
  • LoadOwnedAsset - Akses ke API Engine untuk memuat aset yang dimiliki oleh Anda, dibagikan kepada Anda, dimiliki oleh Roblox, atau merupakan tipe aset yang tidak berbahaya
  • Logging - Akses ke API log
  • Material - Akses ke API Engine terkait dengan material
  • Monetization - Akses ke API Engine terkait dengan monetisasi sebuah game, kecuali sebagian besar PromptPurchases
  • Network - Akses ke API jaringan HTTP
  • Physics - Akses ke instansi terkait dengan fisika
  • PlatformAvatarEditing - Akses ke API Engine terkait dengan membuat atau memperbarui avatar, atau API yang membantu dengan itu
  • Players - Akses ke API Engine terkait dengan kelas Player atau yang mengembalikan/menginteraksikan dengan Players.LocalPlayer
  • PromptExternalPurchase - Mengizinkan akses ke API Engine terkait dengan meminta pembelian aset sembarangan
  • RemoteEvent - Akses ke instansi untuk operasi jaringan internal
  • SensitiveInput - Akses ke API Engine terkait dengan menangkap input sensitif dari pengguna, yaitu sensor perangkat keras dengan privasi tinggi.
  • ServerCommunication - Akses ke API Engine terkait dengan komunikasi antar server, seperti MessagingService
  • Social - Akses ke API Engine yang terkait dengan fitur sosial, seperti teman dan undangan
  • Teleport - Akses ke API Engine yang terkait dengan teleportasi
  • UI - Akses ke instansi terkait dengan antarmuka pengguna

Kemampuan setiap kelas, properti, metode, dan peristiwa ditampilkan dalam referensi API Engine. Misalnya, Player:GetFriendsOnlineAsync() memerlukan kemampuan Player dan Social.

Beberapa metode HttpService tersedia tanpa kemampuan apa pun selain kemampuan untuk mengeksekusi skrip:

Jika sebuah properti instansi atau metode diakses tanpa kemampuan yang diperlukan, sebuah kesalahan dilaporkan yang menggambarkan kemampuan yang hilang.

Akhirnya, kemampuan tidak mencakup setiap instansi di Engine Roblox saat ini. Instansi yang tidak tercantum di bagian ini atau yang berikutnya tidak tersedia untuk interaksi dari kontainer yang disandbox dan menghasilkan kesalahan yang mengatakan bahwa kemampuan Unassigned tidak tersedia untuk skrip saat ini.

Keterbatasan tambahan adalah bahwa fungsi getfenv() dan setfenv() tidak tersedia untuk skrip di dalam kontainer yang disandbox. Memanggilnya dari skrip yang disandbox melaporkan:


Thread saat ini tidak dapat memanggil ['getfenv'/'setfenv'] - target menggunakan API yang tidak tersedia di sandbox saat ini

Hanya akses skrip ke instansi yang dibatasi. Instansi itu sendiri masih bisa ada dan beroperasi sendiri di dalam kontainer yang disandbox. Lampu masih menyala, antarmuka pengguna masih terlihat, dan pengaturan audio yang sudah terhubung tetap memainkan suara.

Interaksi antara kontainer

Kontainer bersarang

Ketika satu kontainer yang disandbox bersarang di dalam kontainer lainnya, instansi dari kontainer dalam dapat diakses oleh kontainer luar.

Kemampuan kontainer dalam dibatasi oleh kemampuan kontainer luar. Misalnya, jika kontainer luar memiliki kemampuan Basic, Audio, dan CSG, sementara kontainer dalam memiliki Basic dan Network, hanya kemampuan Basic yang tersedia untuk kontainer dalam pada saat runtime.

Jika tidak ada kemampuan yang umum antara kontainer dalam dan luar, sekumpulan kemampuan hasilnya kosong.

Fungsi dan acara yang dapat diikat

BindableEvent dan BindableFunction memberikan cara terbaik untuk berkomunikasi dengan kontainer atau memungkinkan kontainer untuk menjalankan callback dengan kemampuan yang tidak diizinkan untuk digunakan secara langsung.

Ketika sebuah acara dipicu atau fungsi dipanggil, koneksi dieksekusi dalam konteks fungsi yang mendaftarkan mereka. Ini berarti bahwa jika callback acara atau fungsi didaftarkan oleh kontainer yang disandbox, ia dipanggil dengan kemampuan kontainer tersebut. Jika callback didaftarkan oleh kode di luar, ketika skrip kontainer yang disandbox memanggil mereka, mereka mengeksekusi fungsi Anda dengan kemampuan yang tersedia untuk fungsi Anda.

Penting untuk dicatat bahwa bahkan dengan kemampuan AccessOutsideWrite, skrip di kontainer yang disandbox tidak dapat memicu acara atau fungsi di luar kontainer mereka jika mereka memiliki sekumpulan kemampuan yang lebih besar daripada kontainer itu sendiri.

Ketika skrip yang disandbox mencoba untuk memicu atau memanggil acara atau fungsi (BindableEvent, BindableFunction, atau RemoteEvent) yang kemampuan nenek moyangnya melebihi kemampuannya sendiri, kesalahan menyebutkan properti untuk diperiksa.

Jika target tidak ada dalam kontainer yang disandbox:


Thread saat ini tidak dapat memicu '<Target>' karena '<Target>' memiliki properti Sandboxed yang diatur ke false tetapi thread yang memanggil disandbox

Untuk menyelesaikan ini, atur Sandboxed ke true untuk target. Sebagai alternatif, Anda dapat memodifikasi sumber dari thread yang memanggil agar Sandboxed diatur ke false, tetapi ini tidak disarankan karena menghilangkan manfaat keamanan yang diberikan oleh sandboxing.

Jika target disandbox tetapi memiliki kemampuan yang tidak dimiliki oleh pemanggil:


Thread saat ini tidak dapat memicu '<Target>' karena '<Target>' memiliki nilai tambahan untuk properti Capabilities: <First Missing Capability> (dan N lainnya)

Untuk menyelesaikan ini, sempitkan Capabilities dari target menjadi subset dari pemanggil, atau perluas Capabilities dari pemanggil agar cocok dengan target.

Mewajibkan modul

ModuleScripts dalam dapat diharuskan oleh kontainer yang disandbox seperti biasa. Namun, jika instansi target berada di luar kontainer, ModuleScript hanya dapat diharuskan jika sekumpulan kemampuan yang tersedia untuk itu lebih kecil atau sama dengan kemampuan yang tersedia untuk kontainer.

Pembatasan ini tidak berlaku untuk kemampuan RunClientScript dan RunServerScript. Jika ModuleScript ditempatkan di dalam kontainer dengan hanya RunClientScript tetapi diharuskan dari skrip yang memiliki kemampuan RunServerScript, itu diizinkan untuk berhasil dan menjalankan fungsi tersebut di server.

Ketika require() gagal karena ketidakcocokan kemampuan, kesalahan menyebutkan modul target dan properti yang harus diperiksa dengan cara yang sama seperti fungsi dan acara yang dapat diikat yang dijelaskan di bagian sebelumnya.

Fungsi yang dipanggil langsung

Jika ModuleScript di dalam kontainer yang disandbox diharuskan dari luar kontainer, beberapa perlindungan tidak tersedia. Secara khusus, fungsi target dapat mengakses semua instansi yang tersedia untuk pemanggil. Jika pemanggil tidak berada dalam kontainer yang disandbox, pemanggilan bertindak seolah-olah AccessOutsideWrite tersedia untuknya.

Pembatasan kemampuan lainnya masih berlaku. Jika Anda memiliki kemampuan akses DataStore, tetapi modul target tidak, maka modul tersebut tidak dapat memanggil metode DataStore. Namun, jika Anda meneruskan fungsi Anda sendiri yang bekerja dengan DataStore, target dapat menjalankannya selama pemanggilan itu. Jika target menjadwalkan thread dengan menggunakan metode seperti yang ada di task, thread tersebut kehilangan kemampuan untuk memanggil fungsi tersebut.

Instansi dapat diteruskan ke modul target atau ditugaskan ke bidang modul.

Jika diperlukan, disarankan untuk menetapkan anggota tabel menggunakan rawset untuk menghindari menjalankan metametode __index/__newindex yang mungkin telah ditetapkan pada tabel.

Rekomendasi keseluruhan adalah untuk berkomunikasi dengan BindableEvent dan BindableFunction kapan pun memungkinkan.

Pergerakan instansi

Sebagian besar instansi tidak memiliki batasan pada pergerakan antar kontainer. Namun, instansi skrip hanya dapat dipindahkan ke dalam kontainer yang memiliki sekumpulan kemampuan yang sama atau subset dari kemampuan tersebut.

Ini berarti bahwa kontainer yang disandbox dengan AccessOutsideWrite tidak dapat hanya memindahkan skrip ke dalam dirinya untuk mendapatkan lebih banyak kemampuan.

©2026 Roblox Corporation. Roblox, logo Roblox, dan Powering Imagination termasuk dalam merek dagang kami yang terdaftar dan tidak terdaftar di AS dan negara lainnya.