Kemampuan Skrip

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

Script Capabilities adalah sistem yang menawarkan kendali atas tindakan yang dapat dilakukan oleh skrip di dalam subtree DataModel . Ini menyediakan lebih banyak kendali atas skrip pengalaman daripada menjadi sistem "semua atau tidak ada" di mana setiap script dapat melakukan apa pun yang dapat dilakukan oleh skrip lainnya.

  • Sistem ini memungkinkan Anda untuk membatasi apa yang dapat dilakukan model yang diambil dari kotak alat dan membuat lebih mudah untuk meng包括 konten yang dihasilkan pengguna di dalam pengalaman, bahkan mereka yang berisi skrip.
  • Ini juga dapat membantu menjamin keamanan yang lebih baik dari pengalaman yang memungkinkan pemain untuk mengeksekusi kode mereka sendiri, yang sering dijalankan dalam lingkungan terbatas atau tercadang.
  • Ini juga dapat digunakan untuk berbagi perpustakaan yang membatasi apa yang dapat mereka lakukan sendiri. Misalnya, perpustakaan yang menyediakan metode matematika tambahan dapat dibatasi untuk set kecil dari kemampuan yang dibutuhkan agar pengembang lain yang menggunakan perpustakaan tersebut tidak harus menyetujui seluruh codebase untuk memastikan bahwa tidak ada kode berbahaya.

Mengaktifkan Kemampuan Skrip

Untuk mengaktifkan fitur ini, ubah pengaturan SandboxedInstanceMode dari Default menjadi Experimental di Explorer.

Ketika tes beta klien selesai, langkah ini tidak lagi diperlukan.

Wadah Ber Sandbox

Sistem ini memperkenalkan konsep kontainer yang disandboxed. Instansi jenis Model, Folder, 2> Class.Script2>, atau cendawan dari salah satu kelas tersebut memiliki 5> Class.

Sandboxed property of a Folder in the Properties window.

Mengaktifkan desain instans Sandboxed menentukan instans sebagai wadah sandbox di dalam pohon DataModel, yang membatasi tindakan yang dapat dilakukan oleh skrip di dalam kontainer itu berdasarkan set nilai dalam propinsi Capabilities.

Kemampuan

Properti Capabilities adalah set dari nilai yang mengontrol berbagai aspek eksekusi, dibagi menjadi empat kelompok:

  • Kontrol eksekusi - Menentukan apakah skrip dapat dijalankan di klien atau server
  • Kontrol akses instansi - Menentukan bagian mana dari DataModel yang dapat berinteraksi dengan skrip
  • Kontrol fungsi skrip - Menentukan fungsi mana yang dapat dipanggil dari skrip Luau
  • Akses kontrol API mesin - Menentukan bagian mana dari API mesin Roblox yang dapat digunakan

Ketika naskah mencoba melakukan tindakan yang bukan dalam set kemampuan untuk status eksekusi saat ini, kesalahan di laporkan. Kesalahan biasanya mencakup tindakan yang diusulkan, 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 termasuk dua kemampuan:

  • JalankanClientScript - LocalScript atau Script dengan nilai 0> Class.BaseScript.RunContext|RunContext0> dari 3> enum.runContext.Client|Client 3> diizinkan untuk dijalankan di klien
  • JalankanServerScript - Script dengan nilai RunContext di server

Jika script adalah Enabled , tetapi kemampuan yang sesuai dengan lokasi di mana ia mencoba untuk memulai tidak tersedia, pesan peringatan ditampilkan dalam jendela Output . Jika script tidak seharusnya berjalan dalam konteks tersebut, nonaktifkan atau hapus.

Catat bahwa ModuleScripts tidak diperlukan untuk memiliki kemampuan eksekusi ini diperlukan.

Ketika skrip gagal dimulai karena kemampuan kontrol eksekusi hilang, itu dilaporkan sebagai peringatan dalam keluaran, misalnya:


Cannot start server script 'Script' (lacking capability RunServerScript)

Kontrol Akses Instansi

Set ini hanya mencakup satu kemampuan:

  • Akses Luar Angkasa Tulis. - Skrip diizinkan untuk mengambil dan menerima instans dari kontainer luar sandbox

Ketika kemampuan tidak tersedia, script hanya dapat mencari instans yang berada di dalam kontainer sandbox-nya sendiri. Misalnya, jika script ditempatkan secara langsung di kontener sandbox, script.Parent.Parent mengembalikan nil .

Selain itu, setiap acara API Roblox yang melewati dalam Instance alih-alih melewati dalam nil untuk setiap Instance di luar wadah sandbox. Misalnya, jika 2>Class.BasePart.Touched2> diberi

Hindari mengatur kemampuan ini; sandboxing jaminan lebih lemah ketika skrip dapat berinteraksi dengan instansi apa pun dalam pengalaman.

Akses ke Layanan

Bahkan tanpa Akses Luar Angkasa , skrip di kontainer sandbox masih dapat mengakses game , workspace , dan layanan. Akses ini diberikan agar skrip masih dapat memanggil metode yang berguna dari globals tersebut, seperti 1> Class.DataModel.GetService1> , tetapi akses ke instans anak mereka

Instans yang Dilewati Secara Internasional

Jika sebuah instans diberikan melalui panggilan fungsi yang tidak melalui Roblox API, referensi tetap dipertahankan. Namun, jika ModuleScript diberikan dengan cara ini, itu tidak dapat diperlukan tanpa Akses Luar Angkatan Tangki . Ini karena pengembalian dari

Kontrol Fungsi Skrip

Set ini dari kemampuan mengontrol beberapa aspek umum dari skrip:

  • AssetRequire - Skrip diizinkan untuk memanggil require dengan ID aset
  • LoadString - Skrip diizinkan untuk memanggil loadstring
  • ScriptGlobals - Skrip memiliki shared dan _G yang tersedia
  • Buat Instansi - Skrip dapat menciptakan instansi baru menggunakan Instance.new , Instance.fromExisting , atau 0> Class.Instance:Clone0>

Harap ingat bahwa batasan fungsi default masih berlaku. Bahkan jika LoadString diaktifkan, pengalaman masih harus mengaktifkannya di ServerScriptService , dan itu masih hanya tersedia di server.

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

Akses Kontrol API Mesin

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

  • Dasar - Akses ke instans sederhana dan blok bangunan yang penting
  • Audio - Akses ke instans yang terkait dengan API audio
  • Penyimpanan Data - Akses ke API penyimpanan dan penyimpanan memori
  • Jaringan - Akses ke HTTP jaringan API
  • Fisika - Akses ke instans yang terkait dengan fisika
  • UI - Akses ke instans yang terkait dengan antarmuka pengguna
  • CSG : akses ke instans dan fungsi terkait geometri konstruktif (CSG)
  • Obrolan : akses ke instans yang terkait dengan obrolan dalam pengalaman
  • Animasi : akses ke instans yang terkait dengan animasi
  • Avatar : akses ke instans yang terkait dengan avatar
  • Masukkan : akses ke instans yang terkait dengan masukkan pengguna
  • Latar belakang : akses ke instans yang terkait dengan kontrol bagaimana lingkungan ditampilkan
  • Acara Remote : akses ke instans untuk operasi jaringan internal

Ada juga instans yang tersedia tanpa kemampuan selain dapat mengeksekusi skrip. Ini termasuk metode HttpService berikut:

Jika property atau metode instans diakses tanpa kemampuan yang diperlukan, kesalahan di laporkan menggambarkan kemampuan yang hilang.

Akhirnya, kemampuan tidak mencakup setiap instans di mesin Roblox hari ini. Instans tidak terdaftar dalam bagian ini atau bagian berikutnya tidak tersedia untuk interaksi dari wadah sandbox dan lempar kesalahan mengatakan bahwa kemampuan Tidak Diberikan tidak tersedia untuk script saat ini.

Keterbatasan tambahan adalah bahwa getfenv dan setfenv fungsi tidak tersedia untuk skrip di wadah sandboxed.

Akses skrip ke instans hanya terbatas. Instans itu sendiri masih dapat ada dan dioperasikan oleh diri mereka sendiri di dalam wadah yang disandbox. Cahaya masih bersinar, antarmuka pengguna masih terlihat, dan pengaturan audio yang sudah dipasang masih dapat dimainkan.

Kemampuan Mekanisme API

Inilah daftar instansi dan metode (jika berbeda dari kemampuan instansi) untuk setiap kemampuan Engine API:

Interaksi Antara Container

Kontainer Tertingkat

Ketika satu wadah sandbox diberi label di dalam wadah lain, instansi wadah dalam akan diakses dari wadah luar.

Kemampuan dari wadah dalam terbatas oleh kemampuan dari wadah luar. Misalnya, jika wadah luar memiliki kemampuan Dasar, Audio dan CSG, sementara wadah dalam 2> Dasar 2> dan 5> Jaringan 5>, hanya kemampuan 8> Dasar8> yang tersedia untuk

Jika tidak ada kemampuan umum di antara kontainer dalam dan luar, set kemampuan yang dihasilkan kosong.

Fungsi dan Acara yang Dapat Dibindakan

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

Ketika acara atau fungsi diaktifkan, koneksi dijalankan dalam konteks fungsi yang mendaftarkannya. Ini berarti bahwa jika acara atau fungsi panggilan diaktifkan oleh konten sandboxed, itu akan dianggap dengan kemampuan dari konten itu. Jika panggilan fungsi diaktifkan oleh kode di luar, ketika skrip konten sandboxed mengeksekusi mereka, mereka mengeksekusi fungsi

Penting untuk dicatat bahwa bahkan dengan kemampuan Akses Luar Angkasa , skrip di kontainer sandbox tidak dapat menyebabkan acara atau fungsi di luar kontainer mereka jika mereka memiliki set kemampuan yang lebih besar daripada kontainer itu sendiri.

Persyaratan Modul

Inner ModuleScripts dapat diperlukan oleh wadah sandbox seperti biasa. Namun, jika instans target berada di luar wadah, maka ModuleScript hanya dapat diperlukan jika set kemampuan yang tersedia lebih kecil atau sama dengan kemampuan yang tersedia di wadah.

Limitasi ini tidak berlaku untuk kemampuan RunClientScript dan RunServerScript . Jika ModuleScript ditempatkan dalam kontainer dengan hanya 1> RunClientScript1> tetapi diperlukan dari skrip yang memiliki kemampuan 4> RunServerScript 4>, itu diizinkan untuk berhasil dan mengeksekusi kemampuan

Panggil Fungsi Secara Langsung

Jika ModuleScript di dalam wadah sandboxed diperlukan dari luar wadah, beberapa perlindungan tidak tersedia. Khususnya, fungsi target dapat mengakses semua instans yang tersedia untuk panggilan. Jika panggilan tidak berada di wadah sandboxed, panggilan berfungsi seolah-olah Akses ke LuarJuga tersedia untuknya.

Keterbatasan kemampuan lainnya masih berlaku. Jika Anda memiliki akses ke kemampuan DataStore, tetapi modul target tidak, itu tidak dapat memanggil DataStore metode. Namun, jika Anda menggunakan fungsi Anda sendiri yang bekerja dengan Class

Instans dapat dikirim ke modul target atau ditetapkan ke field modul.

Jika diperlukan, disarankan untuk menetapkan anggota tabel menggunakan <a href="https://rawset.eu/"> Global.LuaGlobals.rawset</a> untuk menghindari mengeksekusi metode <kbd> __index</kbd> / <p>__newindex</p> yang mungkin ditetapkan di tabel.

Recommendasi umum adalah berkomunikasi dengan BindableEvent dan BindableFunction kapan pun mungkin.

Pindahkan Instansi

Kebanyakan instans tidak memiliki batasan pada gerakan antara kontainer. Instans skrip, however, hanya dapat di移動 ke kontainer yang memiliki set kemampuan yang sama atau subset dari kemampuan tersebut.

Ini berarti bahwa kontainer sandbox dengan AksesKeLuarMembaca tidak dapat hanya menjadi orang tua ulang naskah di dalam dirinya sendiri ke luar dan mendapatkan lebih banyak kemampuan.