腳本功能

*此內容是使用 AI(Beta 測試版)翻譯,可能含有錯誤。若要以英文檢視此頁面,請按一下這裡

Script Capabilities 是一個提供控制於 DataModel 子樹內的動作的系統。它提供更好的控制體驗腳本,而不是一個「或不」系統,在其任何腳本可以做的任何事情。

  • 這個系統讓您限制道具欄中從工具箱取得的模型可以做的事情,並且讓包含指令碼的內容更容易包含在體驗中,即使包含指令碼。
  • 它也可以幫助確保玩家可以執行自己的程式碼,這通常在限制或模擬環境中執行。
  • 它也可以用來分享限制自己所能做的圖書館。例如,提供額外的數學方法的圖書館可以被限制至需要的最小集合,以便其他使用該圖書館的開發者不需要驗證整個代碼,以確認它不包含惡意代碼。

啟用指令功能

要啟用此功能,改變 SandboxedInstanceMode 設定,將 Default 變更為 Experimental 在 Explorer 中。

當客戶端測試版本完成時,此步驟將不再需要。

沙盒容器

此系統介紹了一個名為 沙盒容器 的概念。一個類型為 ModelFolder 、1> Class.Script1> 或其他類型的後代有一個 4> Class.Instance.S

Sandboxed property of a Folder in the Properties window.

啟用 Sandboxed 屬性,將實例視為 DataModel 樹中的沙盒容器,這限制內容器中的腳本按照 Capabilities 屬性的設置執行。

能力

Capilities 屬性是一個控制不同執行過程的四組值的組合:

  • 執行控制 指定要在客戶機或伺服器上執行的指令
  • 控制實例存取權限 - 指定哪些 DataModel 零件可以與指令碼交互
  • 指定哪些 Luau 功能控制器 - 指定哪些功能控制器可以呼叫
  • 引擎 API 存取控制 - 指定 Roblox 引擎 API 的哪些部分可以使用

當指定的能力集中狀態下執行指令時,發生錯誤。錯誤通常包括指定的能力、執行目標和第一個能力,例如:


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)

執行控制

此套件包括兩個能力:

  • 執行客戶程式碼 - LocalScriptScript 使用 0> Class.BaseScript.RunContext|RunContext0> 值的 3> Class.BaseScript 3> 允許在客戶端上執行
  • 執行服務器指令碼 - ScriptRunContext 值的 0> 枚.RunContext.Server|Server0> 可以在服務伺服器上執行

如果指定的 Enabled ,但與它所指定的位置沒有可用的能力,警告訊息將在 輸出 窗口中顯示。如果沒有指定的 Class.BaseScript.Enabled|Enabled ,請啟用或刪除它。

注意,ModuleScripts 不需要這些執行功能才能要求。

如果執行控制功能沒有,發生錯誤時,它會在輸出中報告為警告,例如:


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

實例存取控制

此套件包含只有一個能力:

  • AccessOutsideWrite - 允許從沙盒容器外獲取並接收實例

當功能無法使用時,script.Parent.Parent 只能在自己的沙盒容器內尋找實例。例如,如果nil 直接放置在沙盒容器中,nil 將返回2>5>。

此外,任何 Roblox API 事件,以 Instance 代替通過沙盒容器外的任何 nil 傳送時,都會以 Instance 傳送。例如,如果 1> Class.BasePart.Touched1> 被指定為�����

避免設定此能力;沙盒保證在任何體驗中與任何實例互動時更弱

存取服務

即使沒有 AccessOutsideWrite ,在沙盒容器中的腳本仍然可以存取 gameworkspace 和服務。這個存取提供讓腳本仍然可以呼叫這些全球的有用方法,例如 1> Class.DataModel.GetService1> ,但仍然可以呼叫其子容器。

內部通過實例

如果在 Roblox API 通過功能呼叫傳送時,不是通過 Roblox API 傳送的,參考資料將被保留。 但如果 ModuleScript 在此方式通過,它不能被要求,需要先使用 AccessOutsideWrite 。這是因為 ModuleScript 的返回通常是可變的,並且可

指令功能控制

這套能力控制一些簡單的程式碼:

請注意,預設功能限制仍然適用。即使 載入字串 啟用,體驗仍然必須在 ServerScriptService 中啟用,並且只在服務伺服器上提供。

要創建新實例,除了 建立實例 之外,還需要一個額外的引擎 API 功能,提供存取該實例的權限。

引擎 API 存取控制

這個最後一組控制程式碼使用各種引擎 API 的權限:

  • 基本 - 存取簡單的例子和必要的建造磚塊
  • 音訊 - 存取與音訊 API 相關的實例
  • 數據存取 - 存取數據存取和內存存取 API
  • 網路 - 存取 HTTP 網路 API
  • 物理學 - 存取與物理學相關的實例
  • UI 介面 - 存取與用戶介面相關的實例
  • CSG : 存取與建造物體相關的 CSG 實例和函數
  • 聊天 : 存取與體驗聊天相關的實例
  • 動畫 : 存取與動畫相關的實例
  • 虛擬人偶 : 虛擬人偶與相關人物的交互
  • 輸入 :存取與用戶輸入相關的實例
  • 環境 :檢視環境顯示方式的控制相關的實例
  • 遠端事件 : 存取內部網路操作的實例

也有可用的例子,不論是否具有執行指令碼的能力。這些方法包括以下 HttpService 方法:

若使用不可用的能力來存取實例屬性或方法,將發生錯誤,記錄說明沒有可用的能力。

最後,功能今天在 Roblox 引擎中不適用於每個實例。未列出的實例或下一個區域內沒有可用的實例。發生此錯誤說明 未分配 功能對於當前指令碼不可用。

額外的限制是,getfenvsetfenv 對於沙盒容器中的腳本不可用。

只有腳本對象才有限。腳本自己仍然可以存在並且從自動檢測到處理。燈仍然會發光,使用者介面仍然可以顯示,音頻設定已經連接好了。

引擎 API 能力分配

這裡是每個引擎 API 能力的實例和方法列表 (如果與實例功能不同):

容器之間的互動

子容器

當一個沙盒容器被另一個容器巢穴時,內部容器的實例可以存取外部容器。

內部容器的能力是外部容器的能力的限制。例如,如果外部容器有 基本、音頻 和 CSG 的能力,而內部容器有 2>基本2> 和 5>網路5>,則在執行階段時內部容器僅能使用 8>基本8> 容器的能

如果內部和外部容器沒有任何相容性,結果的容量設置將為空。

可綁定的功能和事件

BindableEventBindableFunction 提供最佳方式來與容器通信,或允許它執行回歸式功能,但它本身並不允許使用直接。

當發生事件或功能時,連接會在其註冊的函數上下文執行。這意味著如果沙盒容器注冊了事件或功能,那麼如果外部代碼註冊了容器指令,它們就會以容器的能力來執行您的功能。如果代碼在外部註冊了程式碼,當程式碼在沙盒容器上呼叫時,它們就會執行您的程式碼以程式碼可用給您

注意,即使具有 AccessOutsideWrite 功能,但在沙盒容器中的腳本不能在容器自身的外部召喚事件或功能,如果它們有更大的容量設置。

模組需求

內部 ModuleScripts 可以由沙盒容器通常需要。但如果目標實例位於容器外,ModuleScript 只能在容器能力集可用能力集中減少或等同於容器能力集。

此限制不適用於 RunClientScriptRunServerScript 功能。如果 ModuleScript 放置在容器中只有 1> RunClientScript1> 但需要從有 4> RunServerScript4> 功能的腳本,它就允許成功並在服務伺服器上執行這些功能。

直接呼叫函數

如果需要從容器中的沙盒容器中需要 ModuleScript,一些保護機制不可用。特別是目標功能可以存取所有可用給訪問者的實例。如果訪問者不在沙盒容器中,呼叫將作為 存取外部寫入 可用。

其他能力限制仍然適用。如果您有 資料存取器 存取能力,但目標模組不是,它將無法呼叫 DataStore 方法。 但如果您通過自己的程式碼運行 DataStore ,目標可以在該呼叫中執行

可以將實例傳送至目標模組或分配到模組田。

如果需要,建議使用 rawset 來分配桌子成員,以避免執行 __index / __newindex 上的 metamethodes 可能會在桌子上設置。

總體建議是與 BindableEventBindableFunction 通訊, whenever 可能。

移動實例

大多數情況下,不會在容器之間有限制移動。 腳本容器, however,只能移動到具有相同集合功能或子集功能的容器。

這意味著 AccessOutsideWrite 的沙盒容器無法只是在自己內部重新父級化指定的指令碼以外的環境來執行它,並且獲得更多功能。