ความสามารถของสคริปต์

*เนื้อหานี้แปลโดยใช้ AI (เวอร์ชัน Beta) และอาจมีข้อผิดพลาด หากต้องการดูหน้านี้เป็นภาษาอังกฤษ ให้คลิกที่นี่

ความสามารถของสคริปต์ เป็นระบบที่ให้การควบคุมการดำเนินการที่สคริปต์สามารถดำเนินการได้ภายใน DataModel สาขาย่อยมันให้การควบคุมดีกว่าเกี่ยวกับสคริปต์ประสบการณ์มากกว่าที่จะเป็นระบบ "ทั้งหมดหรือไม่มีอะไร" ที่สคริปต์ใดๆ สามารถทำอะไรได้

  • ระบบนี้ช่วยให้คุณจำกัดสิ่งที่โมเดลที่นำมาจากกล่องเครื่องมือสามารถทำได้และทำให้ง่ายต่อการรวมเนื้อหาที่สร้างโดยผู้ใช้ไว้ภายในประสบการณ์แม้แต่ผู้ที่มีสคริปต์
  • นอกจากนี้ยังสามารถช่วยให้แน่ใจได้ว่าประสบการณ์ที่อนุญาตให้ผู้เล่นรันโค้ดของตนเองมีความปลอดภัยดีขึ้น รหัส
  • นอกจากนี้ยังสามารถใช้เพื่อแบ่งปันไลบรารีที่จำกัดสิ่งที่พวกเขาสามารถทำเองได้ตัวอย่างเช่น ห้องสมุดที่ให้วิธีการคณิตศาสตร์เพิ่มเติมสามารถจำกัดไว้ที่ชุดความสามารถที่เล็กที่สุดที่ต้องการเพื่อให้นักพัฒนาคนอื่นที่ใช้ห้องสมุดนั้นไม่ต้องตรวจสอบทั้งหมดของโค้ดเพื่อให้แน่ใจว่าไม่มีโค้ดที่เป็นอันตราย

เปิดใช้งานความสามารถของสคริปต์

คุณสมบัติเปลี่ยนการตั้งค่า SandboxedInstanceMode จาก Default เป็น Experimental ใน Explorer

เมื่อการทดสอบเบต้าของไคลเอนต์สําเร็จแล้ว ขั้นตอนนี้จะไม่จำเป็นอีกต่อไป

คอนเทนเนอร์ที่กักขังแล้ว

ระบบนี้แนะนำแนวคิดของกล่องทราย sandboxed container ตัวอย่างของประเภท Model , Folder , Script หรือลูกหลานของคลาสใดๆ มีคุณสมบัติ Sandboxed ที่มีอยู่ในหน้าต่าง คุณสมบัติในสตูดิโอ ภายใต้ส่วน สิทธิ์

Sandboxed property of a Folder in the Properties window.

การเปิดใช้งานคุณสมบัติ 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
  • ScriptGlobals - สคริปมี shared และ _G ที่ใช้ได้
  • สร้างตัวอย่าง - สคริปต์สามารถสร้างตัวอย่างใหม่โดยใช้ 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 เครื่องยนต์แต่ละรายการ:

การโต้ตอบระหว่างคอนเทนเนอร์

คอนเทนเนอร์ซ้อนกัน

เมื่อคอนเทนเนอร์ที่กักขังหนึ่งถูกซ้อนอยู่ภายในอีกคอนเทนเนอร์หนึ่ง ตัวอย่างของคอนเทนเนอร์ภายในจะสามารถเข้าถึงคอนเทนเนอร์ภายนอกได้

ความสามารถของภาชนะภายในจะถูกจำกัดโดยความสามารถของภาชนะภายนอกตัวอย่างเช่น หากภาชนะภายนอกมีความสามารถของ พื้นฐาน , เสียง และ CSG , ในขณะที่ภาชนะภายในมี พื้นฐาน และ เครือข่าย , ความสามารถพื้นฐานเพียง พื้นฐาน ที่มีอยู่ในภาชนะภายในในเวลาเรียกใช้

หากไม่มีความสามารถร่วมกันระหว่างภาชนะภายในและภายนอก ชุดความสามารถที่ได้รับจะว่างเปล่า

ฟังก์ชันและอีเวนต์ที่สามารถผูกได้

BindableEvent และ BindableFunction ให้วิธีที่ดีที่สุดในการสื่อสารกับคอนเทนเนอร์หรืออนุญาตให้มันเรียกกลับความสามารถที่มันเองไม่ได้รับอนุญาตให้ใช้โดยตรง

เมื่อเหตุการณ์หรือฟังก์ชันถูกกระตุ้น การเชื่อมต่อจะถูกดำเนินการในบริบทของฟังก์ชันที่ลงทะเบียนพวกเขาซึ่งหมายความว่าหากอีเวนต์หรือฟังก์ชันการโทรกลับได้รับการลงทะเบียนโดยคอนเทนเนอร์ที่ถูกกรอง จะถูกเรียกด้วยความสามารถของคอนเทนเนอร์นั้นหาก callback ได้รับการลงทะเบียนโดยโค้ดภายนอกเมื่อใช้สคริปต์ในคอนเทนเนอร์แซนด์บ็อกซ์พวกเขาจะดำเนินการฟังก์ชันของคุณด้วยความสามารถที่มีอยู่สำหรับฟังก์ชันของคุณ

เป็นสิ่งสำคัญที่ต้องทราบว่าแม้จะมีความสามารถในการเขียนนอกสถานที่ AccessOutsideWrite แต่สคริปต์ในคอนเทนเนอร์ที่ถูกกันก็ไม่สามารถเรียกเหตุการณ์หรือฟังก์ชันนอกคอนเทนเนอร์ได้หากพวกเขามีความสามารถที่กว้างกว่าคอนเทนเนอร์เอง

จำเป็นต้อง

ภายใน ModuleScripts สามารถต้องการโดยคอนเทนเนอร์ที่ถูกกันไว้ได้ตามปกติอย่างไรก็ตาม หากตัวอย่างเป้าหมายอยู่นอกกรอบคอนเทนเนอร์ ตัวเลือก ModuleScript สามารถต้องการได้เฉพาะในกรณีที่ชุดความสามารถที่มีอยู่สำหรับมันมีขนาดเล็กกว่าหรือเท่ากับความสามารถที่มีอยู่ในคอนเทนเนอร์

ข้อจํากัดนี้ไม่ใช้กับความสามารถ RunClientScript และ RunServerScript หาก ModuleScript ถูกวางในคอนเทนเนอร์ที่มีเพียง RunClientScript แต่ต้องการจากสคริปที่มีความสามารถ RunServerScript ก็สามารถสำเร็จและดำเนินการฟังก์ชันเหล่านั้นบนเซิร์ฟเวอร์ได้

เรียกฟังก์ชันโดยตรง

หากต้องการให้ ModuleScript ในคอนเทนเนอร์ที่ถูกกันอยู่จากภายนอกคอนเทนเนอร์ การป้องกันบางอย่างไม่สามารถใช้ได้โดยเฉพาะฟังก์ชันเป้าหมายสามารถเข้าถึงตัวอย่างทั้งหมดที่มีอยู่สำหรับผู้เรียกได้หากผู้เรียกไม่อยู่ในคอนเทนเนอร์ที่กำหนดเอง การโทรจะดำเนินการเหมือนว่า AccessOutsideWrite สามารถใช้งานได้

ข้อจํากัดความสามารถอื่น ๆ ยังคงมีอยู่หากคุณมีความสามารถในการเข้าถึง DataStore แต่โมดูลเป้าหมายไม่มี คุณไม่สามารถเรียกใช้วิธี DataStore ได้อย่างไรก็ตาม หากคุณส่งฟังก์ชันของคุณเองทำงานกับ DataStore เป้าหมายสามารถรันได้ในระหว่างการโทรนั้นหากเป้าหมายกำหนดการกระทู้โดยใช้วิธีการเช่นเดียวกับที่มาจาก task กระทู้เหล่านั้นจะสูญเสียความสามารถในการเรียกใช้ฟังก์ชันนั้น

ตัวแปรสามารถส่งไปยังโมดูลเป้าหมายหรือกำหนดให้กับฟิลด์โมดูลได้

หากจำเป็น แนะนำให้กำหนดสมาชิกตารางโดยใช้ เพื่อหลีกเลี่ยงการดําเนินการ / เมทาวิธีที่อาจถูกกำหนดบนตาราง

คำแนะนำโดยรวมคือการสื่อสารกับ BindableEvent และ BindableFunction เมื่อใดก็ตามที่เป็นไปได้

การเคลื่อนย้ายของตัวอย่าง

ส่วนใหญ่ไม่มีข้อจำกัดในการเคลื่อนไหวระหว่างคอนเทนเนอร์อย่างไรก็ตาม ตัวอย่างสคริปต์สามารถย้ายไปยังคอนเทนเนอร์ที่มีชุดความสามารถเดียวกันหรือชุดความสามารถส่วนหนึ่งเท่านั้น

ซึ่งหมายความว่าคอนเทนเนอร์ที่ถูกล็อคด้วย AccessOutsideWrite ไม่สามารถเพียงแค่ย้ายสคริปต์ภายในตัวเองไปยังภายนอกและรับความสามารถเพิ่มเติมได้