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

การเปิดใช้งานคุณสมบัติ Sandboxed จะกำหนดให้ตัวอย่างเป็นคอนเทนเนอร์ที่ปิดล้อมภายในต้นไม้ DataModel ซึ่งจำกัดการดำเนินการที่สคริปต์ภายในคอนเทนเนอร์สามารถดำเนินการได้ตามชุดค่าที่กำหนดไว้ในคุณสมบัติ Capabilities
คุณสมบัติ
คุณสมบัติ Capabilities เป็นชุดของค่าที่ควบคุมด้านต่างๆ ของการดำเนินการ แยกออกเป็นกลุ่มสี่:
- การควบคุมการดําเนินการ - ระบุว่าสคริปต์สามารถรันบนไคลเอนต์หรือเซิร์ฟเวอร์ได้หรือไม่
- การควบคุมการเข้าถึงตัวอย่าง - ระบุส่วนใดที่สคริปต์สามารถโต้ตอบได้ DataModel
- การควบคุมฟังก์ชันของสคริปต์ - ระบุสคริปต์ฟังก์ชัน Luau ที่สามารถโทรได้
- การควบคุมการเข้าถึง API เครื่องยนต์ - ระบุส่วนใดของ API เครื่องยนต์ Roblox ที่สามารถใช้ได้
เมื่อสคริปต์พยายามดำเนินการตามคำสั่งที่ไม่อยู่ในชุดความสามารถสำหรับสถานะการดําเนินการปัจจุบันแล้วจะมีการรายงานข้อผิดพลาดข้อผิดพลาดมักจะรวมถึงการดำเนินการที่พยายามทำ เป้าหมายของการดำเนินการ และความสามารถครั้งแรกที่ขาดหายไป เช่น:
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)
การควบคุมการดําเนินการ
ชุดนี้รวมถึงสองความสามารถ:
- รันสคริปต์ไคลเอนต์ - LocalScript หรือ Script ด้วยค่า RunContext ของ Client จะได้รับอนุญาตให้ดำเนินการบนไคลเอนต์
- เรียกสคริปต์เซิร์ฟเวอร์ - Script ด้วยค่า RunContext ของ Server เป็นสิ่งที่อนุญาตให้ดำเนินการบนเซิร์ฟเวอร์
หากสคริปต์เป็น Enabled แต่ความสามารถที่ตรงกับตำแหน่งที่พยายามเริ่มต้นไม่สามารถใช้งานได้ ข้อความเตือนจะปรากฏในหน้าต่าง ออก หากสคริปต์ไม่ควรทำงานในบริบทนั้น ให้ปิดใช้งานหรือลบมัน
โปรดทราบว่า ModuleScripts ไม่จำเป็นต้องมีความสามารถในการดําเนินการเหล่านี้ที่จำเป็น
เมื่อสคริปต์ไม่สามารถเริ่มต้นได้เนื่องจากความสามารถในการควบคุมการดําเนินการขาดหายไป จะรายงานเป็นคําเตือนในออก ตัวอย่างเช่น:
Cannot start server script 'Script' (lacking capability RunServerScript)
การควบคุมการเข้าถึงตัวอย่าง
ชุดนี้รวมถึงเพียงความสามารถเดียวเท่านั้น:
- เข้าถึงภายนอกเขียน - สคริปต์สามารถดึงและรับตัวอย่างจากภายนอกคอนเทนเนอร์ที่กำหนดเองได้
เมื่อความสามารถไม่พร้อมใช้งาน สคริปต์สามารถมองหาตัวอย่างที่อยู่ภายในคอนเทนเนอร์ทรายของตัวเองได้เท่านั้นตัวอย่างเช่นหากสคริปต์ถูกวางโดยตรงในคอนเทนเนอร์ที่กักขังแล้ว script.Parent.Parent จะส่งคืน nil
นอกจากนี้ กิจกรรม API Roblox ใดๆ ที่ผ่านใน Instance แทนที่จะผ่านใน nil สำหรับใดๆ Instance นอกกล่องทรายตัวอย่างเช่น หาก BasePart.Touched ได้รับสัญญาณจากการสัมผัสจากตัวอย่างนอกกล่องทราย อีเวนต์ยังคงได้รับ แต่อาร์กิวเมนต์คือ nil
หลีกเลี่ยงการตั้งค่าความสามารถนี้; การรับประกันการทดสอบทรายจะอ่อนแอลงเมื่อสคริปต์สามารถโต้ตอบกับตัวอย่างใดๆ ในประสบการณ์
การเข้าถึงบริการ
แม้ไม่มี AccessOutsideWrite สคริปต์ในคอนเทนเนอร์ที่กักขังยังสามารถเข้าถึง game , workspace และบริการได้การเข้าถึงนี้จะให้บริการเพื่อให้สคริปต์ยังคงเรียกวิธีที่มีประโยชน์ของโกลบอลเหล่านั้นได้ เช่น DataModel.GetService แต่การเข้าถึงตัวอย่างลูกยังคงได้รับการตรวจสอบ
ส่งตัวอย่างภายในอย่างถูกต้อง
หากตัวอย่างผ่านการเรียกฟังก์ชันที่ไม่ผ่าน API Roblox อ้างอิงจะถูกเก็บไว้อย่างไรก็ตาม ถ้า ModuleScript ถูกส่งในลักษณะนี้ จะไม่สามารถต้องการได้โดยไม่มี AccessOutsideWrite เนื่องจากการคืนของ ModuleScript มักจะสามารถเปลี่ยนแปลงได้และสามารถปรับเปลี่ยนได้โดยสคริปต์ในคอนเทนเนอร์ที่ถูกกันไว้
การควบคุมฟังก์ชันของสคริปต์
ชุดควบคุมความสามารถนี้ควบคุมบางด้านทั่วไปของสคริปต์:
- ความต้องการสินทรัพย์ - สคริปต์สามารถโทรไปที่ require ด้วยรหัสสินทรัพย์
- โหลดสตริง - สคริปต์สามารถโทรได้ loadstring
- สร้างตัวอย่าง - สคริปต์สามารถสร้างตัวอย่างใหม่โดยใช้ Instance.new , Instance.fromExisting หรือ Instance:Clone()
โปรดจำไว้ว่าข้อจํากัดฟังก์ชันเริ่มต้นยังคงมีอยู่แม้ว่า LoadString จะเปิดใช้งานแล้ว ประสบการณ์ก็ยังต้องเปิดใช้งานใน ServerScriptService และยังคงมีอยู่เฉพาะในเซิร์ฟเวอร์เท่านั้น
เพื่อสร้างตัวอย่างใหม่ นอกเหนือจาก สร้างตัวอย่าง จำเป็นต้องมีความสามารถของ API เครื่องยนต์เพิ่มเติมที่ให้การเข้าถึงตัวอย่างนั้น
การควบคุมการเข้าถึง API เครื่องยนต์
กลุ่มความสามารถล่าสุดนี้ควบคุมการเข้าถึงสคริปต์ไปยังหลาย API เครื่องยนต์:
- พื้นฐาน - การเข้าถึงตัวอย่างง่ายๆ และบล็อกการสร้างที่จำเป็น
- เสียง - การเข้าถึงตัวอย่างที่เกี่ยวข้องกับ API เสียง
- คลังข้อมูล - การเข้าถึง API คลังข้อมูลและหน่วยความจํา
- เครือข่าย - การเข้าถึง API เครือข่าย HTTP
- ฟิสิกส์ - การเข้าถึงตัวอย่างที่เกี่ยวข้องกับฟิสิกส์
- UI - การเข้าถึงตัวอย่างที่เกี่ยวข้องกับอินเทอร์เฟซผู้ใช้
- CSG : การเข้าถึงตัวอย่างและฟังก์ชันที่เกี่ยวข้องกับเรขาคณิตแข็งสร้างสรรค์ (CSG)
- แชท : การเข้าถึงตัวอย่างที่เกี่ยวข้องกับแชทในประสบการณ์
- แอนิเมชัน : การเข้าถึงตัวอย่างที่เกี่ยวข้องกับแอนิเมชัน
- อวตาร : การเข้าถึงตัวอย่างที่เกี่ยวข้องกับอวตาร
- การใส่ : การเข้าถึงตัวอย่างที่เกี่ยวข้องกับการใส่ของผู้ใช้
- สภาพแวดล้อม : การเข้าถึงตัวอย่างที่เกี่ยวข้องกับการควบคุมวิธีที่สภาพแวดล้อมจะแสดง
- อีเวนต์ระยะไกล : การเข้าถึงตัวอย่างสำหรับการดำเนินการเครือข่ายภายใน
นอกจากนี้ยังมีตัวอย่างที่สามารถใช้งานได้โดยไม่มีความสามารถใดๆ นอกเหนือจากการสามารถดําเนินการตามสคริปต์ได้ซึ่งรวมถึงวิธีต่อไปนี้ HttpService วิธี:
หากคุณสมบัติหรือวิธีการของตัวอย่างไม่ได้รับการเข้าถึงโดยไม่มีความสามารถที่จำเป็น จะมีการรายงานข้อผิดพลาดอธิบายถึงความสามารถที่ขาดหายไป
ในที่สุดความสามารถไม่ครอบคลุมทุกตัวอย่างใน Roblox Engine ในวันนี้ตัวอย่างที่ไม่อยู่ในส่วนนี้หรือต่อไปนี้ไม่สามารถใช้งานร่วมกันจากคอนเทนเนอร์ที่ถูกกันไว้และโยนข้อผิดพลาดที่ระบุว่าความสามารถ ไม่ได้รับการจัดสรร ไม่สามารถใช้งานได้กับสคริปต์ปัจจุบัน
ข้อจํากัดเพิ่มเติมคือฟังก์ชัน getfenv และ setfenv ไม่สามารถใช้งานได้สําหรับสคริปต์ในคอนเทนเนอร์ที่ปิดล้อม
การเข้าถึงสคริปต์เฉพาะต่อตัวอย่างจำกัดเวลาตัวอย่างเองยังคงมีอยู่และทำงานโดยตัวเองภายในคอนเทนเนอร์ที่กำหนดเองได้ภายในกล่องทรายไฟยังคงส่องสว่าง อินเทอร์เฟซผู้ใช้ยังคงมองเห็นได้ และการตั้งค่าเสียงเพลงที่มีอยู่แล้วถูกเชื่อมต่อเล่นเสียง
การจัดสรรความสามารถของ API เครื่องยนต์
นี่คือรายการตัวอย่างและวิธีการ (ถ้าแตกต่างจากความสามารถของตัวอย่าง) สำหรับความสามารถของ API เครื่องยนต์แต่ละรายการ:
พื้นฐาน * Attachment
ร้านข้อมูล * DataStore , OrderedDataStore , GlobalDataStore
ฟิสิกส์ * 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 (ต้องมี พื้นฐาน ด้วย) NegateOperation (ต้องมี พื้นฐาน ด้วย) PartOperation (ต้องมี พื้นฐาน ) UnionOperation (ต้องมี พื้นฐาน )
แอนิเมชัน * Bone (ต้องมี พื้นฐาน ด้วย)
สภาพแวดล้อม * Atmosphere , Clouds , Lighting , Sky
อีเวนต์ระยะไกล * BaseRemoteEvent , RemoteEvent , UnreliableRemoteEvent
การโต้ตอบระหว่างคอนเทนเนอร์
คอนเทนเนอร์ซ้อนกัน
เมื่อคอนเทนเนอร์ที่กักขังหนึ่งถูกซ้อนอยู่ภายในอีกคอนเทนเนอร์หนึ่ง ตัวอย่างของคอนเทนเนอร์ภายในจะสามารถเข้าถึงคอนเทนเนอร์ภายนอกได้
ความสามารถของภาชนะภายในจะถูกจำกัดโดยความสามารถของภาชนะภายนอกตัวอย่างเช่น หากภาชนะภายนอกมีความสามารถของ พื้นฐาน , เสียง และ CSG , ในขณะที่ภาชนะภายในมี พื้นฐาน และ เครือข่าย , ความสามารถพื้นฐานเพียง พื้นฐาน ที่มีอยู่ในภาชนะภายในในเวลาเรียกใช้
หากไม่มีความสามารถร่วมกันระหว่างภาชนะภายในและภายนอก ชุดความสามารถที่ได้รับจะว่างเปล่า
ฟังก์ชันและอีเวนต์ที่สามารถผูกได้
BindableEvent และ BindableFunction ให้วิธีที่ดีที่สุดในการสื่อสารกับคอนเทนเนอร์หรืออนุญาตให้มันเรียกกลับความสามารถที่มันเองไม่ได้รับอนุญาตให้ใช้โดยตรง
เมื่อเหตุการณ์หรือฟังก์ชันถูกกระตุ้น การเชื่อมต่อจะถูกดำเนินการในบริบทของฟังก์ชันที่ลงทะเบียนพวกเขาซึ่งหมายความว่าหากอีเวนต์หรือฟังก์ชันการโทรกลับได้รับการลงทะเบียนโดยคอนเทนเนอร์ที่ถูกกรอง จะถูกเรียกด้วยความสามารถของคอนเทนเนอร์นั้นหาก callback ได้รับการลงทะเบียนโดยโค้ดภายนอกเมื่อใช้สคริปต์ในคอนเทนเนอร์แซนด์บ็อกซ์พวกเขาจะดำเนินการฟังก์ชันของคุณด้วยความสามารถที่มีอยู่สำหรับฟังก์ชันของคุณ
เป็นสิ่งสำคัญที่ต้องทราบว่าแม้จะมีความสามารถในการเขียนนอกสถานที่ AccessOutsideWrite แต่สคริปต์ในคอนเทนเนอร์ที่ถูกกันก็ไม่สามารถเรียกเหตุการณ์หรือฟังก์ชันนอกคอนเทนเนอร์ได้หากพวกเขามีความสามารถที่กว้างกว่าคอนเทนเนอร์เอง
จำเป็นต้อง
ภายใน ModuleScripts สามารถต้องการโดยคอนเทนเนอร์ที่ถูกกันไว้ได้ตามปกติอย่างไรก็ตาม หากตัวอย่างเป้าหมายอยู่นอกกรอบคอนเทนเนอร์ ตัวเลือก ModuleScript สามารถต้องการได้เฉพาะในกรณีที่ชุดความสามารถที่มีอยู่สำหรับมันมีขนาดเล็กกว่าหรือเท่ากับความสามารถที่มีอยู่ในคอนเทนเนอร์
ข้อจํากัดนี้ไม่ใช้กับความสามารถ RunClientScript และ RunServerScript หาก ModuleScript ถูกวางในคอนเทนเนอร์ที่มีเพียง RunClientScript แต่ต้องการจากสคริปที่มีความสามารถ RunServerScript ก็สามารถสำเร็จและดำเนินการฟังก์ชันเหล่านั้นบนเซิร์ฟเวอร์ได้
เรียกฟังก์ชันโดยตรง
หากต้องการให้ ModuleScript ในคอนเทนเนอร์ที่ถูกกันอยู่จากภายนอกคอนเทนเนอร์ การป้องกันบางอย่างไม่สามารถใช้ได้โดยเฉพาะฟังก์ชันเป้าหมายสามารถเข้าถึงตัวอย่างทั้งหมดที่มีอยู่สำหรับผู้เรียกได้หากผู้เรียกไม่อยู่ในคอนเทนเนอร์ที่กำหนดเอง การโทรจะดำเนินการเหมือนว่า AccessOutsideWrite สามารถใช้งานได้
ข้อจํากัดความสามารถอื่น ๆ ยังคงมีอยู่หากคุณมีความสามารถในการเข้าถึง DataStore แต่โมดูลเป้าหมายไม่มี คุณไม่สามารถเรียกใช้วิธี DataStore ได้อย่างไรก็ตาม หากคุณส่งฟังก์ชันของคุณเองทำงานกับ DataStore เป้าหมายสามารถรันได้ในระหว่างการโทรนั้นหากเป้าหมายกำหนดการกระทู้โดยใช้วิธีการเช่นเดียวกับที่มาจาก task กระทู้เหล่านั้นจะสูญเสียความสามารถในการเรียกใช้ฟังก์ชันนั้น
ตัวแปรสามารถส่งไปยังโมดูลเป้าหมายหรือกำหนดให้กับฟิลด์โมดูลได้
หากจำเป็น แนะนำให้กำหนดสมาชิกตารางโดยใช้ เพื่อหลีกเลี่ยงการดําเนินการ / เมทาวิธีที่อาจถูกกำหนดบนตาราง
คำแนะนำโดยรวมคือการสื่อสารกับ BindableEvent และ BindableFunction เมื่อใดก็ตามที่เป็นไปได้
การเคลื่อนย้ายของตัวอย่าง
ส่วนใหญ่ไม่มีข้อจำกัดในการเคลื่อนไหวระหว่างคอนเทนเนอร์อย่างไรก็ตาม ตัวอย่างสคริปต์สามารถย้ายไปยังคอนเทนเนอร์ที่มีชุดความสามารถเดียวกันหรือชุดความสามารถส่วนหนึ่งเท่านั้น
ซึ่งหมายความว่าคอนเทนเนอร์ที่ถูกล็อคด้วย AccessOutsideWrite ไม่สามารถเพียงแค่ย้ายสคริปต์ภายในตัวเองไปยังภายนอกและรับความสามารถเพิ่มเติมได้