ความสามารถของสคริปต์ ช่วยให้คุณควบคุมการกระทำที่สคริปต์สามารถดำเนินการภายในต้นไม้ DataModel โดยแทนที่จะใช้ "ระบบทั้งหมดหรือไม่มีเลย" คุณสามารถตั้งค่าสคริปต์ให้สามารถเข้าถึงหมวดหมู่บางประเภท เช่น เสียง ฟิสิกส์ ฐานข้อมูล และอื่น ๆ
- ระบบนี้ช่วยให้คุณสามารถจำกัดโมเดลที่นำมาจากเครื่องมือทำงานได้ และทำให้การรวมเนื้อหาที่สร้างโดยผู้ใช้ง่ายขึ้นภายในเกม
- ยังช่วยให้มั่นใจถึงความปลอดภัยที่ดีกว่าของเกมที่อนุญาตให้ผู้เล่นเรียกใช้โค้ดของตนเอง ซึ่งมักจะถูกดำเนินการในสภาพแวดล้อมที่จำกัดหรือเลียนแบบ
- นอกจากนี้ยังสามารถใช้เพื่อแชร์ไลบรารีที่จำกัดสิ่งที่พวกเขาสามารถทำได้ด้วยตนเอง ตัวอย่างเช่น ไลบรารีที่ให้วิธีคณิตศาสตร์เพิ่มเติมสามารถถูกจำกัดให้มีชุดความสามารถที่เล็กที่สุดที่จำเป็นเพื่อให้นักพัฒนาคนอื่นที่ใช้ไลบรารีนั้นไม่ต้องตรวจสอบฐานรหัสทั้งหมดเพื่อให้มั่นใจว่าไม่มีโค้ดที่ไม่ปลอดภัย
เปิดใช้ความสามารถของสคริปต์
เพื่อเปิดใช้ฟีเจอร์นี้ให้เปลี่ยนค่าในคุณสมบัติ SandboxedInstanceMode จาก Default เป็น Experimental ในหน้าต่าง Explorer และ Properties
ภาชนะที่ถูกจำกัด
ความสามารถของสคริปต์แนะนำแนวคิดของ ภาชนะที่ถูกจำกัด Models, Folders, Scripts หรือทายาทของคลาสใด ๆ เหล่านี้มีคุณสมบัติ Sandboxed ที่สามารถใช้ได้ในหน้าต่าง Properties

การเปิดใช้คุณสมบัติ Sandboxed จะระบุว่าตัวแปรนั้นเป็นภาชนะที่ถูกจำกัดภายในต้นไม้ DataModel ซึ่งจะจำกัดการกระทำที่สคริปต์ภายในภาชนะนี้สามารถดำเนินการได้ตามชุดค่าที่อยู่ในคุณสมบัติ Capabilities
ความสามารถ
คุณสมบัติ Capabilities เป็นชุดของค่าที่ควบคุมด้านต่าง ๆ ของการดำเนินการ ความสามารถแบ่งออกเป็นหมวดหมู่กว้าง ๆ ดังต่อไปนี้:
- การควบคุมการดำเนินการ - ระบุว่าสคริปต์สามารถทำงานบนลูกค้าหรือเซิร์ฟเวอร์ได้หรือไม่
- การควบคุมการเข้าถึงอินสแตนซ์ - ระบุตอนที่สคริปต์สามารถทำงานกับส่วนต่าง ๆ ของ DataModel
- การควบคุมฟังก์ชันการทำงานของสคริปต์ - ระบุว่าฟังก์ชัน Luau ใดบ้างที่สคริปต์สามารถเรียกใช้
- การควบคุมการเข้าถึง API ของเอนจิน - ระบุว่าบางส่วนของ Roblox Engine API สามารถใช้งานได้หรือไม่
เมื่อสคริปต์พยายามดำเนินการที่ไม่อยู่ในชุดความสามารถ Roblox จะรายงานข้อผิดพลาด ข้อผิดพลาดโดยทั่วไปจะรวมถึงการกระทำที่พยายามดำเนินการ เป้าหมายของการกระทำ และความสามารถแรกที่ขาดหายไป:
เธรดปัจจุบันไม่สามารถปรับเปลี่ยน 'Workspace' (ขาดความสามารถ AccessOutsideWrite)เธรดปัจจุบันไม่สามารถเรียก 'Clone' (ขาดความสามารถ CreateInstances)เธรดปัจจุบันไม่สามารถเรียก 'GetSecret' (ขาดความสามารถ Network)
การควบคุมการดำเนินการ
สองความสามารถที่จัดการการควบคุมการดำเนินการมีดังนี้:
ถ้าสคริปต์มี Enabled แต่ความสามารถที่ตรงกับตำแหน่งที่มันพยายามเริ่มไม่มีอยู่ ข้อความเตือนจะแสดงในหน้าต่าง Output หากไม่ควรให้สคริปต์ทำงานในบริบทนั้น ให้ปิดหรือลบมัน
โปรดทราบว่า ModuleScripts ไม่จำเป็นต้องมีความสามารถในการดำเนินการเหล่านี้เพื่อให้ถูกเรียกใช้
เมื่อสคริปต์ไม่สามารถเริ่มทำงานได้เนื่องจากขาดความสามารถในการควบคุมการดำเนินการ จะรายงานเป็นคำเตือนในเอาท์พุต เช่น:
ไม่สามารถเริ่มสคริปต์เซิร์ฟเวอร์ 'Script' (ขาดความสามารถ RunServerScript)
การควบคุมการเข้าถึงอินสแตนซ์
ความสามารถหนึ่งเดียวจัดการการควบคุมการเข้าถึงอินสแตนซ์:
- AccessOutsideWrite - สคริปต์ได้รับอนุญาตให้ดึงและรับอินสแตนซ์จากภายนอกภาชนะที่ถูกจำกัด
เมื่อความสามารถนี้ไม่มีอยู่ สคริปต์สามารถค้นหาอินสแตนซ์ที่อยู่ภายในภาชนะที่ถูกจำกัดของตนเองได้เท่านั้น ตัวอย่างเช่น หากสคริปต์ถูกวางอยู่ในภาชนะที่ถูกจำกัด โดยตรง script.Parent.Parent จะส่งคืน nil
นอกจากนี้ อีเวนต์ API ของ Roblox ใด ๆ ที่ส่งผ่าน Instance จะส่งผ่าน nil สำหรับ Instance ใด ๆ ที่อยู่นอกภาชนะที่ถูกจำกัด ตัวอย่างเช่น หาก BasePart.Touched ถูกส่งสัญญาณโดยการสัมผัสจากอินสแตนซ์นอกภาชนะที่ถูกจำกัด อีเวนต์นั้นก็ยังได้รับ แต่พารามิเตอร์คือ nil
หลีกเลี่ยงการตั้งค่าความสามารถนี้; การรับประกันการแซนบ็อกซ์จะอ่อนแอลงเมื่อสคริปต์สามารถมีปฏิสัมพันธ์กับอินสแตนซ์ใด ๆ ในเกม
การเข้าถึงบริการ
แม้จะไม่มี AccessOutsideWrite สคริปต์ในภาชนะที่ถูกจำกัดก็ยังสามารถเข้าถึง game, workspace, และบริการต่าง ๆ ได้ การเข้าถึงนี้จัดทำขึ้นเพื่อให้สคริปต์สามารถเรียกใช้วิธีที่มีประโยชน์ของตัวแปรเหล่านั้น เช่น DataModel.GetService แต่การเข้าถึงอินสแตนซ์ลูกยังคงถูกตรวจสอบ
อินสแตนซ์ที่ส่งผ่านภายใน
หากมีการส่งอินสแตนซ์ผ่านการเรียกฟังก์ชันที่ไม่ได้ผ่าน API ของ Roblox การอ้างอิงจะถูกเก็บรักษาไว้ อย่างไรก็ตาม หากถูกส่งข้ามทางโดย ModuleScript จะไม่สามารถเรียกใช้ได้โดยไม่มี AccessOutsideWrite ซึ่งเนื่องจากผลลัพธ์ของ ModuleScript มักมีการปรับเปลี่ยนได้และอาจถูกปรับเปลี่ยนโดยสคริปต์ในภาชนะที่ถูกจำกัด
การควบคุมฟังก์ชันการทำงานของสคริปต์
ชุดความสามารถนี้ควบคุมด้านทั่วไปบางประการของสคริปต์:
- CreateInstances - สคริปต์สามารถสร้างอินสแตนซ์ใหม่โดยใช้ Instance.new, Instance.fromExisting, หรือ Instance:Clone()
- LoadString - สคริปต์สามารถเรียก loadstring ได้
โปรดทราบว่าข้อจำกัดของฟังก์ชันเริ่มต้นยังคงมีผล แม้ว่า LoadString จะเปิดใช้งาน เกมก็ยังต้องเปิดใช้งานใน ServerScriptService และยังสามารถใช้งานได้เฉพาะบนเซิร์ฟเวอร์เท่านั้น
ในการสร้างอินสแตนซ์ใหม่ นอกจาก CreateInstances แล้ว จำเป็นต้องมีความสามารถ API ของเอนจินเพิ่มเติมที่ให้การเข้าถึงไปยังอินสแตนซ์นั้น
การควบคุมการเข้าถึง API ของเอนจิน
กลุ่มความสามารถสุดท้ายนี้ควบคุมการเข้าถึงสคริปต์ไปยัง API ของเอนจินที่แตกต่างกัน:
- Animation - การเข้าถึงอินสแตนซ์ที่เกี่ยวข้องกับอนิเมชัน
- AssetCreateUpdate - การเข้าถึง API ของเอนจินที่เกี่ยวข้องกับการสร้างหรือปรับปรุงทรัพย์สิน
- AssetManagement - การเข้าถึง API ของเอนจินที่เกี่ยวข้องกับการปฏิบัติการบนทรัพย์สินที่ไม่ใช่การอ่าน สร้าง หรือปรับปรุง
- AssetRead - การเข้าถึง API ของเอนจินที่เกี่ยวข้องกับการรับข้อมูลเกี่ยวกับทรัพย์สิน
- Audio - การเข้าถึงอินสแตนซ์ที่เกี่ยวข้องกับ API เสียง
- AvatarAppearance - การเข้าถึงอินสแตนซ์ที่เกี่ยวข้องกับองค์ประกอบภาพของตัวละคร
- AvatarBehavior - การเข้าถึง API ของเอนจินที่เกี่ยวข้องกับการควบคุมหรือปรับเปลี่ยนตัวละคร
- Basic - การเข้าถึง API ทั่วไปที่มีความเสี่ยงต่ำ
- CSG - การเข้าถึงอินสแตนซ์และฟังก์ชันที่เกี่ยวข้องกับเรขาคณิตแบบบวก (CSG)
- CapabilityControl - การเข้าถึงการปรับเปลี่ยนคุณสมบัติ Sandboxed และ Capabilities ของอินสแตนซ์
- Capture - การเข้าถึง API ของเอนจินที่เกี่ยวข้องกับการจับภาพหน้าจอหรือวิดีโอบนหน้าจอของผู้ใช้
- Chat - การเข้าถึงอินสแตนซ์ที่เกี่ยวข้องกับการแชทในเกม
- Consequences - การเข้าถึง API สำหรับลงโทษผู้ใช้ (การเตะหรือแบน)
- DataStore - การเข้าถึง API ของฐานข้อมูลและหน่วยความจำ
- DynamicGeneration - การเข้าถึง API ของเอนจินที่เกี่ยวข้องกับการปรับเปลี่ยนทรัพย์สินแบบไดนามิก
- Environment - การเข้าถึงอินสแตนซ์ที่เกี่ยวข้องกับการควบคุมการแสดงผลของสภาพแวดล้อม
- Groups - การเข้าถึง API ของเอนจินที่เกี่ยวข้องกับกลุ่ม/ชุมชน
- Input - การเข้าถึงอินสแตนซ์ที่เกี่ยวข้องกับการป้อนข้อมูลจากผู้ใช้
- LegacySound - การเข้าถึง API ของเอนจินที่เกี่ยวข้องกับเสียงที่กำลังจะเลิกใช้งาน
- LoadOwnedAsset - การเข้าถึง API ของเอนจินสำหรับการโหลดทรัพย์สินที่คุณเป็นเจ้าของ แบ่งปันให้คุณ เป็นเจ้าของโดย Roblox หรือเป็นประเภททรัพย์สินที่ไม่เป็นพิษเป็นภัย
- Logging - การเข้าถึง API ของบันทึก
- Material - การเข้าถึง API ของเอนจินที่เกี่ยวข้องกับวัสดุ
- Monetization - การเข้าถึง API ของเอนจินที่เกี่ยวข้องกับการสร้างรายได้จากเกม ยกเว้นส่วนใหญ่ของ PromptPurchases
- Network - การเข้าถึง API การเชื่อมต่อ HTTP
- Physics - การเข้าถึงอินสแตนซ์ที่เกี่ยวข้องกับฟิสิกส์
- PlatformAvatarEditing - การเข้าถึง API ของเอนจินที่เกี่ยวข้องกับการสร้างหรือปรับปรุงตัวละคร หรือ API ที่ช่วยในการทำเช่นนั้น
- Players - การเข้าถึง API ของเอนจินที่เกี่ยวข้องกับคลาส Player หรือที่คืนค่าหรือมีปฏิสัมพันธ์กับ Players.LocalPlayer
- PromptExternalPurchase - อนุญาตการเข้าถึง API ของเอนจินที่เกี่ยวข้องกับการขอให้ซื้อทรัพย์สินที่ไร้สาระ
- RemoteEvent - การเข้าถึงอินสแตนซ์สำหรับการดำเนินการเครือข่ายภายใน
- SensitiveInput - การเข้าถึง API ของเอนจินที่เกี่ยวข้องกับการจับข้อมูลที่ละเอียดอ่อนจากผู้ใช้ เช่นเซ็นเซอร์ฮาร์ดแวร์ที่มีความเป็นส่วนตัวสูง
- ServerCommunication - การเข้าถึง API ของเอนจินที่เกี่ยวข้องกับการสื่อสารข้ามเซิร์ฟเวอร์ เช่น MessagingService
- Social - การเข้าถึง API ของเอนจินที่เกี่ยวข้องกับคุณสมบัติทางสังคม เช่น เพื่อนและคำเชิญ
- Teleport - การเข้าถึง API ของเอนจินที่เกี่ยวข้องกับการเคลื่อนย้าย
- UI - การเข้าถึงอินสแตนซ์ที่เกี่ยวข้องกับส่วนต่อประสานผู้ใช้
ความสามารถของแต่ละคลาส คุณสมบัติ วิธีการ และเหตุการณ์จะแสดงใน เอกสารอ้างอิง API ของเอนจิน ตัวอย่างเช่น Player:GetFriendsOnlineAsync() ต้องการความสามารถ Player และ Social
หลายวิธีใน HttpService สามารถใช้งานได้โดยไม่ต้องมีความสามารถใด ๆ นอกเหนือจากการสามารถใช้สคริปต์ได้:
หากมีการเข้าถึงคุณสมบัติหรือลักษณะต่าง ๆ ของอินสแตนซ์โดยไม่มีความสามารถที่ต้องการ ข้อผิดพลาดจะถูกบันทึกโดยอธิบายถึงความสามารถที่ขาดหายไป
สุดท้าย ความสามารถต่าง ๆ ไม่ได้ครอบคลุมทุกอินสแตนซ์ใน Roblox Engine ณ วันนี้ อินสแตนซ์ที่ไม่ได้ระบุในส่วนนี้หรือในส่วนถัดไปจะไม่สามารถมีปฏิสัมพันธ์จากภาชนะที่ถูกจำกัดและจะโยนข้อผิดพลาดที่บอกว่าความสามารถ Unassigned ไม่สามารถใช้ได้กับสคริปต์ปัจจุบัน
ข้อจำกัดเพิ่มเติมคือฟังก์ชัน getfenv() และ setfenv() จะไม่สามารถใช้ได้สำหรับสคริปต์ในภาชนะที่ถูกจำกัด การเรียกใช้จากสคริปต์ที่ถูกจำกัดจะแสดงข้อผิดพลาดว่า:
เธรดปัจจุบันไม่สามารถเรียก ['getfenv'/'setfenv'] ได้ - เป้าหมายใช้ APIs ที่ไม่สามารถใช้ได้ใน Sandbox ปัจจุบัน
การเข้าถึงอินสแตนซ์เท่านั้นที่ถูกจำกัด อินสแตนซ์เองยังสามารถมีอยู่และทำงานได้ด้วยตนเองภายในภาชนะที่ถูกจำกัด ไฟยังคงส่องสว่าง ส่วนต่อประสานผู้ใช้ยังคงมองเห็นได้ และการตั้งค่าเสียงที่เชื่อมโยงกันแล้วจะเล่นเสียง
การโต้ตอบระหว่างภาชนะ
ภาชนะที่ซ้อนกัน
เมื่อภาชนะที่ถูกจำกัดหนึ่งอยู่ภายในอีกอัน อินสแตนซ์ของภาชนะภายในจะสามารถเข้าถึงได้จากภายนอก
ความสามารถของภาชนะภายในจะจำกัดด้วยความสามารถของภาชนะภายนอก ตัวอย่างเช่น หากภาชนะภายนอกมีความสามารถ Basic, Audio และ CSG ในขณะที่ภาชนะภายในมี Basic และ Network ความสามารถ Basic เท่านั้นที่จะสามารถใช้งานได้ภายในภาชนะในเวลาทำงาน
หากไม่มีความสามารถที่เหมือนกันระหว่างภาชนะภายในและภายนอก ชุดความสามารถที่ได้ผลลัพธ์จะว่างเปล่า
ฟังก์ชันและอีเวนต์ที่สามารถผูกได้
BindableEvent และ BindableFunction เป็นวิธีที่ดีที่สุดในการสื่อสารกับภาชนะหรืออนุญาตให้มันเรียกใช้งานคอลแบ็กที่มีความสามารถที่มันไม่ได้อนุญาตให้ใช้โดยตรง
เมื่ออีเวนต์ถูกเรียกใช้หรือตัวฟังก์ชันถูกเรียกใช้ การเชื่อมต่อจะดำเนินการในบริบทของฟังก์ชันที่ลงทะเบียนพวกมัน นี่หมายความว่าหากอีเวนต์หรือคอลแบ็กถูกลงทะเบียนโดยภาชนะที่ถูกจำกัด จะถูกเรียกใช้ด้วยความสามารถของภาชนะนั้น ๆ หากคอลแบ็กถูกลงทะเบียนโดยโค้ดภายนอก เมื่อสคริปต์ภายในภาชนะที่ถูกจำกัดเรียกใช้งาน มันจะดำเนินการฟังก์ชันของคุณโดยมีความสามารถที่พร้อมใช้งาน
สิ่งสำคัญที่ต้องทราบคือแม้จะมีความสามารถ AccessOutsideWrite สคริปต์ในภาชนะที่ถูกจำกัดไม่สามารถเรียกใช้เหตุการณ์หรือฟังก์ชันภายนอกภาชนะได้หากพวกเขามีชุดความสามารถที่ใหญ่กว่าภาชนะเอง
เมื่อสคริปต์ที่ถูกจำกัดพยายามจะเรียกใช้งานหรือเรียกอีเวนต์หรือฟังก์ชัน (BindableEvent, BindableFunction หรือ RemoteEvent) ซึ่งมีความสามารถบรรพบุรุษเกินขอบเขตของมัน ข้อผิดพลาดจะระบุชื่อคุณสมบัติให้ตรวจสอบ
หากเป้าหมายไม่อยู่ในภาชนะที่ถูกจำกัดใด ๆ:
เธรดปัจจุบันไม่สามารถเรียกใช้งาน '<Target>' ได้ เนื่องจาก '<Target>' มีคุณสมบัติ Sandboxed ตั้งค่าเป็น false แต่เธรดที่เรียกใช้ถูกจำกัด
เพื่อแก้ไขปัญหานี้ให้ตั้งค่า Sandboxed เป็น true สำหรับเป้าหมาย หรือคุณสามารถแก้ไขที่มาของเธรดที่เรียกให้ตั้งค่า Sandboxed เป็น false แต่ไม่แนะนำเพราะจะขจัดประโยชน์ด้านความปลอดภัยที่การแซนบ็อกซ์มอบให้
หากเป้าหมายถูกจำกัดแต่มีความสามารถที่ผู้เรียกไม่มี:
เธรดปัจจุบันไม่สามารถเรียกใช้งาน '<Target>' ได้ เนื่องจาก '<Target>' มีค่าเพิ่มเติมสำหรับคุณสมบัติ Capabilities: <First Missing Capability> (และ N มากกว่า)
เพื่อแก้ไขปัญหานี้ ให้แคบชุด Capabilities ของเป้าหมายให้เป็นกลุ่มย่อยของผู้เรียก หรือขยาย Capabilities ของผู้เรียกให้ตรงกับของเป้าหมาย
การเรียกโมดูล
ModuleScripts ภายในสามารถถูกเรียกโดยภาชนะที่ถูกจำกัดตามปกติ อย่างไรก็ตาม หากอินสแตนซ์เป้าหมายอยู่ภายนอกภาชนะ จะสามารถเรียก ModuleScript ได้เฉพาะเมื่อชุดความสามารถที่มีพร้อมให้มีขนาดเล็กกว่าหรือเท่ากับความสามารถที่มีอยู่ในภาชนะ
ข้อจำกัดนี้ไม่ใช้กับความสามารถ RunClientScript และ RunServerScript หาก ModuleScript อยู่ในภาชนะที่มีเฉพาะ RunClientScript แต่ถูกเรียกจากสคริปต์ที่มีความสามารถ RunServerScript จะได้รับอนุญาตให้สำเร็จและทำงานฟังก์ชันเหล่านั้นบนเซิร์ฟเวอร์
เมื่อ require() ล้มเหลวจากความไม่ตรงกันของความสามารถ ข้อผิดพลาดจะระบุชื่อโมดูลเป้าหมายและคุณสมบัติให้ตรวจสอบในลักษณะเดียวกับฟังก์ชันและอีเวนต์ที่สามารถผูกได้ซึ่งได้อธิบายไว้ในส่วนก่อนหน้า
ฟังก์ชันที่ถูกเรียกโดยตรง
หาก ModuleScript ในภาชนะที่ถูกจำกัดถูกเรียกจากภายนอกภาชนะ การป้องกันบางอย่างจะไม่สามารถใช้ได้ โดยเฉพาะฟังก์ชันเป้าหมายสามารถเข้าถึงอินสแตนซ์ทั้งหมดที่มีอยู่เพื่อผู้เรียก หากผู้เรียกไม่อยู่ในภาชนะที่ถูกจำกัด การเรียกใช้จะมีผลเหมือนกับ AccessOutsideWrite มีให้แก่ผู้เรียก
ข้อจำกัดของความสามารถอื่น ๆ ยังคงมีผล หากคุณมีความสามารถในการเข้าถึง DataStore แต่โมดูลเป้าหมายไม่มีมันจะไม่สามารถเรียกใช้วิธีการใน DataStore ได้ อย่างไรก็ตาม หากคุณส่งฟังก์ชันที่ทำงานกับ DataStore โมดูลเป้าหมายจะสามารถทำงานมันในระหว่างการเรียกใช้
หากเป้าหมายกำหนดตารางด้วยวิธี เช่น วิธีการจาก task เธรดเหล่านั้นจะสูญเสียความสามารถในการเรียกฟังก์ชันนั้น
อินสแตนซ์สามารถถูกส่งไปยังโมดูลเป้าหมายหรือกำหนดให้กับฟิลด์ในโมดูล
หากต้องการแนะนำให้กำหนดสมาชิกของตารางโดยใช้ rawset เพื่อหลีกเลี่ยงการเรียกใช้งาน __index/__newindex เมตาเมธอดที่อาจถูกตั้งค่าในตาราง
คำแนะนำทั่วไปคือการสื่อสารด้วย BindableEvent และ BindableFunction เมื่อเป็นไปได้
การเคลื่อนย้ายอินสแตนซ์
อินสแตนซ์ส่วนใหญ่ไม่มีข้อจำกัดเกี่ยวกับการเคลื่อนที่ระหว่างภาชนะ แต่สคริปต์อินสแตนซ์สามารถเคลื่อนย้ายได้เฉพาะไปยังภาชนะที่มีชุดความสามารถชุดเดียวกันหรือชุดย่อยของความสามารถเหล่านั้น
นั่นหมายความว่าภาชนะที่ถูกจำกัดด้วย AccessOutsideWrite ไม่สามารถเพียงแค่เปลี่ยนพ่อแม่ของสคริปต์ภายในไปยังภายนอกและได้รับความสามารถมากขึ้นได้