スクリプト機能 は、DataModel を制御するシステムです。エクスペリエンススクリプトのコントロールが向上し、他のスクリプトが行うことができるすべてのことを行う「すべてまたはなし」システムよりもなります。
- このシステムでは、ツールボックスから取得したモデルが行うことができることを制限でき、ユーザー生成コンテンツをエクスペリエンスに含めることが簡単になり、スクリプトを含むものさえも含めることができます。
- また、プレイヤーが独自のコードを実行できる経験のより良いセキュリティを保証するのにも役立ちます、これは通常、制限されたまたはエミュレートされた環境で実行されます。
- 自分でできることを制限するライブラリを共有するのにも使用できます。たとえば、追加の数学メソッドを提供するライブラリは、そのライブラリを使用する他の開発者が全体のコードベースを検証する必要がないように、必要な最小限の機能セットに制限されることができます。これにより、悪意のあるコードが含まれていないかどうかを確認するために、ライブラリを使用する他の開発者が全体のコードベースを検証する必要がなくなります。
スクリプト機能を有効にする
この機能を有効にするには、エクスプローラーで SandboxedInstanceMode 設定を Default から Experimental に変更してください。
クライアントベータテストが完了すると、このステップはもう必要ありません。
サンドボックス化されたコンテナ
このシステムは、 サンドボックス化コンテナ のコンセプトを紹介します。タイプのインスタンス Model , Folder , Script 、またはそれらのクラスの子孫は、Studio Sandboxed ウィンドウの パーミッション セクションで、利用可能な プロパティ があります。

Sandboxed プロパティを有効にすると、インスタンスは DataModel ツリー内のサンドボックスコンテナとして指定され、そのコンテナ内のスクリプトが Capabilities プロパティのセットの値に基づいて実行できるアクションが制限されます。
機能
Capabilities プロパティは、実行の異なる側面を制御する値のセットで、4つのグループに分割されています:
- 実行制御 - スクリプトがクライアントまたはサーバーで実行できるかどうかを指定
- インスタンスアクセス制御 - スクリプトが対話できるパーツを指定する DataModel
- スクリプト機能制御 - Luau 機能スクリプトが呼び出すことができる機能を指定
- エンジン API アクセス制御 - ロブロックスエンジン 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)
実行制御
このセットには、2つの機能が含まれています:
スクリプトが Enabled であるが、開始しようとしている場所に対応する機能が利用できない場合、 出力 ウィンドウに警告メッセージが表示されます。スクリプトがそのコンテキストで実行されるべきではない場合は、無効にしたり削除したりします。
注: ModuleScripts は、これらの実行能力が必要である必要がないことに注意してください。
スクリプトが実行制御機能が欠落しているために起動できないとき、出力に警告として報告されます(例:
Cannot start server script 'Script' (lacking capability RunServerScript)
インスタンスアクセス制御
このセットには、単一の機能だけが含まれています:
- AccessOutsideWrite - スクリプトは、サンドボックス化されたコンテナの外部からインスタンスを取得して受信することが許可されています
機能が利用できない場合、スクリプトは自分のサンドボックス化されたコンテナ内にあるインスタンスのみを検索できます。たとえば、スクリプトをサンドボックス化されたコンテナに直接配置すると、script.Parent.Parent は nil を返します。
さらに、任意の Roblox API イベントが Instance ではなく nil でパスすると、サンドボックス化されたコンテナ外のすべての Instance がパスします。たとえば、サンドボックス化されたコンテナ外のインスタンスからのタッチによって BasePart.Touched がシグナル化された場合、イベントはまだ受信されますが、引数は nil です。
この機能を設定しないでください;サンドボックス保証は、スクリプトがエクスペリエンス内のインスタンスと対話できるときに弱くなります。
サービスへのアクセス
AccessOutsideWrite なしでも、サンドボックス化されたコンテナ内のスクリプトはまだ game 、workspace、およびサービスにアクセスできます。このアクセスは、スクリプトがまだ DataModel.GetService のようなグローバルの有用なメソッドを呼び出すことができるように提供されますが、子インスタンスへのアクセスは引き続き有効に検証されます。
内部でパスされたインスタンス
インスタンスが Roblox API を通過しない関数呼び出しを介して渡された場合、参照は保存されます。しかし、この方法で ModuleScript がパスされると、 AccessOutsideWrite なしでは要求できません。これは、ModuleScript の返却がしばしば変更可能であり、サンドボックス化されたコンテナ内のスクリプトによって変更できるためです。
スクリプト機能制御
この能力セットは、スクリプトの一般的な側面を制御します:
- アセット要求 - スクリプトはアセットIDで require を呼び出すことが許可されています
- LoadString - スクリプトは loadstring を呼び出すことが許可されています
- CreateInstances - スクリプトは、Instance.new、Instance.fromExisting、または Instance:Clone() を使用して新しいインスタンスを作成できます
デフォルト機能制限がまだ適用されていることに注意してください。Even if LoadString が有効になっている場合でも、エクスペリエンスはまだ ServerScriptService で有効にする必要があり、サーバー上でのみ利用可能です。
新しいインスタンスを作成するには、 CreateInstances のほか、そのインスタンスにアクセスできる追加のエンジン API 機能が必要です。
エンジン API アクセス制御
この最後のグループの機能は、さまざまなエンジン API へのスクリプトアクセスを制御します:
- ベース - 単純なインスタンスや必須のビルディングブロックへのアクセス
- オーディオ - オーディオ API に関連するインスタンスへのアクセス
- データストア - データストアとメモリストアAPIへのアクセス
- ネットワーク - HTTP ネットワーク APIへのアクセス
- 物理 - 物理に関連するインスタンスへのアクセス
- UI - ユーザーインターフェイスに関連するインスタンスへのアクセス
- CSG : 建設的なソリッド幾何学に関連するインスタンスと機能へのアクセス (CSG)
- チャット : インエクスペリエンスチャットに関連するインスタンスへのアクセス
- アニメーション : アニメーションに関連するインスタンスへのアクセス
- アバター :アバターに関連するインスタンスへのアクセス
- 入力 : ユーザーの入力に関連するインスタンスへのアクセス
- 環境 : 環境の表示方法に関するインスタンスへのアクセス
- リモートイベント : 内部ネットワーク操作のインスタンスへのアクセス
スクリプトを実行できる以外の能力がない場合でも使用できるインスタンスもあります。これには次の HttpService メソッドが含まれます:
必要な能力なしでインスタンスのプロパティまたはメソッドにアクセスすると、その能力の欠如を説明するエラーが報告されます。
最後に、能力は今日の Roblox エンジンですべてのインスタンスをカバーしていません。このセクションまたは次のセクションにリストされていないインスタンスは、サンドボックス化されたコンテナからのインタラクションができず、現在のスクリプトに 割り当てられていない 能力が利用できないというエラーを投げます。
追加の制限は、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
コンテナ間のインタラクション
ネストされたコンテナ
1つのサンドボックスコンテナが別のコンテナの中にネストされているとき、内部コンテナのインスタンスは外部コンテナにアクセスできます。
内部コンテナの機能は、外部コンテナの機能に制限されます。たとえば、外部コンテナには 基本 、 オーディオ 、および CSG の機能があり、内部コンテナには 基本 と ネットワーク があるが、実行時に内部コンテナには 基本 機能しか利用できない。
内部と外部のコンテナ間で共通の機能がない場合、結果の機能セットは空です。
バインド可能な機能とイベント
BindableEvent と BindableFunction は、コンテナとコミュニケーションする最良の方法を提供したり、自身が直接使用できない機能を呼び出すことを許可したりします。
イベントまたは関数が発動すると、接続はそれらを登録した機能のコンテキストで実行されます。つまり、イベントまたは機能コールバックがサンドボックス化されたコンテナに登録された場合、そのコンテナの機能で呼び出されます。コールバックが外部コードによって登録された場合、サンドボックスコンテナスクリプトが呼び出されると、機能が利用可能な機能とともに、機能が実行されます。
アクセス外書き能力でさえ、サンドボックス化されたコンテナ内のスクリプトは、コンテナ自体よりも大きな機能セットを持っている場合、コンテナ外のイベントや機能を呼び出すことはできません。
モジュールが必必須
内部 ModuleScripts は、通常通りサンドボックス化されたコンテナによって必須とすることができます。しかし、ターゲットインスタンスがコンテナの外にある場合、ModuleScript は、利用可能な能力セットがコンテナに利用可能な能力と小さいか等しい場合にのみ必須です。
この制限は RunClientScript および RunServerScript 機能には適用されません。If the ModuleScript は、 RunClientScript のみのコンテナに配置されているが、 RunServerScript 機能を持つスクリプトから必要とされている場合、サーバー上でそれらの機能を実行して成功することが許可されます。
直接呼び出された関数
サンドボックス化されたコンテナ内の ModuleScript がコンテナ外から必要な場合、一部の保護は利用できません。特に、ターゲット関数は、呼び出し元に利用可能なすべてのインスタンスにアクセスできます。呼び出しがサンドボックス化されたコンテナにない場合、呼び出しは アクセス外部書き込み が利用可能であるとして動作します。
他の能力制限がまだ適用されます。データストアへのアクセス能力があるが、ターゲットモジュールにはない場合、 データストア 方法を呼び出すことができません。しかし、自分の機能を DataStore で動作させると、ターゲットはその呼び出し中にそれを実行できます。ターゲットが task のようなメソッドを使用してスレッドをスケジュールすると、それらのスレッドはその機能を呼び出す能力を失います。
インスタンスはターゲットモジュールにパスされたり、モジュールフィールドに割り当てられます。
必要に応じて、rawset を使用してテーブルメンバーを割り当てることで、テーブルに設定される可能性のある __index / __newindex メタメソッドを実行を避けることが推奨されます。
全体的な推奨は、可能な限り BindableEvent と BindableFunction にコミュニケーションすることです。
インスタンスの移動
ほとんどのインスタンスには、コンテナ間の移動に制限がありません。しかし、スクリプトインスタンスは、同じセットの機能またはその機能のサブセットがあるコンテナにのみ移動できます。
これは、 AccessOutsideWrite を持つサンドボックス化コンテナが、外部にスクリプトを再親化して、より多くの機能を得ることができないことを意味します。