スクリプトの機能を使用すると、DataModel サブツリー内でスクリプトが実行できるアクションを制御できます。デフォルトの「全てか無かのシステム」ではなく、スクリプトが音声、物理、データストアなどの特定のカテゴリにのみアクセスできるように設定できます。
- このシステムを使用すると、ツールボックスから取得したモデルが実行できることを制限でき、ユーザー生成コンテンツをゲームに含めるのが容易になります。
- プレイヤーが自分のコードを実行できるゲームのセキュリティを向上させるのにも役立ち、通常は制限されたまたはエミュレーション環境で実行されます。
- また、自身の機能を制限するライブラリを共有するためにも使用できます。たとえば、追加の数学メソッドを提供するライブラリは、悪意のあるコードを含まないことを確実にするために、他の開発者が検証しなくて済むよう、必要な最小限の機能セットに制限できます。
スクリプトの機能を有効にする
この機能を有効にするには、Explorer と Properties ウィンドウで、SandboxedInstanceMode プロパティを Default から Experimental に変更します。
サンドボックス化されたコンテナ
スクリプトの機能では、サンドボックス化されたコンテナという概念が導入されます。Models、Folders、Scripts、またはこれらのクラスのいずれかの子孫には、Properties ウィンドウに Sandboxed プロパティが表示されます。

Sandboxed プロパティを有効にすると、そのインスタンスが DataModel ツリー内のサンドボックス化されたコンテナとして指定され、そのコンテナ内のスクリプトが実行できるアクションが Capabilities プロパティの値に基づいて制限されます。
機能
Capabilities プロパティは、実行のさまざまな側面を制御する値のセットです。機能は次のような大きなカテゴリに分けられます。
- 実行制御 - スクリプトがクライアントまたはサーバーで実行できるかどうかを指定する
- インスタンスアクセス制御 - スクリプトが操作できる DataModel パーツを指定する
- スクリプト機能制御 - スクリプトが呼び出すことができるLuau関数を指定する
- エンジンAPIアクセス制御 - RobloxエンジンAPIのどの部分が使用できるかを指定する
スクリプトが機能のセットに含まれていないアクションを実行しようとすると、Robloxはエラーを報告します。エラーには通常、試みているアクション、アクションのターゲット、欠けている最初の機能が含まれます:
現在のスレッドは「Workspace」を変更できません(欠けている機能 AccessOutsideWrite)現在のスレッドは「Clone」を呼び出せません(欠けている機能 CreateInstances)現在のスレッドは「GetSecret」を呼び出せません(欠けている機能 Network)
実行制御
2つの機能が実行制御を扱います:
スクリプトが Enabled の場合でも、開始しようとする場所に対応する機能が利用できない場合、Output ウィンドウに警告メッセージが表示されます。その文脈でスクリプトを実行する予定でなかった場合は、無効にするか削除してください。
ModuleScripts は、これらの実行機能を必要としないことに注意してください。
実行制御機能が欠けているためスクリプトの起動に失敗した場合、以下のように出力で警告が報告されます:
サーバースクリプト「Script」を起動できません(欠けている機能 RunServerScript)
インスタンスアクセス制御
単一の機能がインスタンスアクセス制御を扱います:
- AccessOutsideWrite - スクリプトがサンドボックス化されたコンテナの外部からインスタンスを取得し受け取ることを許可されます。
この機能が利用できない場合、スクリプトは自分のサンドボックス化されたコンテナ内のインスタンスのみを参照できます。たとえば、スクリプトがサンドボックス化されたコンテナ内に直接配置されている場合、script.Parent.Parent は nil を返します。
さらに、Instance を渡すRoblox APIイベントは、サンドボックス化されたコンテナの外部の Instance に対しては nil を渡します。たとえば、サンドボックス化されたコンテナの外部からインスタンスのタッチによって BasePart.Touched がシグナルされると、イベントは受信されますが、引数は nil になります。
この機能を設定することは避けてください。スクリプトがゲーム内の任意のインスタンスと相互作用できると、サンドボックスの保証が弱くなります。
サービスへのアクセス
AccessOutsideWrite がなくても、サンドボックス化されたコンテナ内のスクリプトはまだ game、workspace、およびサービスにアクセスできます。これにより、スクリプトは DataModel.GetService のような便利なメソッドを呼び出せるようになっていますが、その子インスタンスへのアクセスは依然として検証されます。
内部で渡されるインスタンス
関数呼び出しを通じてインスタンスが渡されると、その参照が保持されます。ただし、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 - 自分が所有している、共有されている、Robloxによって所有されている、または良性資産タイプである資産を読み込むためのエンジンAPIへのアクセス
- Logging - ログAPIへのアクセス
- Material - 材料に関連するエンジンAPIへのアクセス
- Monetization - ゲームの収益化に関連するエンジンAPIへのアクセス(ほとんどの PromptPurchases を除く)
- Network - HTTPネットワーキングAPIへのアクセス
- Physics - 物理に関連するインスタンスへのアクセス
- PlatformAvatarEditing - アバターを作成または更新することに関連するエンジンAPIへのアクセス
- PromptExternalPurchase - 任意の資産の購入を促すエンジンAPIへのアクセス
- RemoteEvent - 内部ネットワーキング操作のためのインスタンスへのアクセス
- SensitiveInput - ユーザーからのセンシティブな入力をキャプチャすることに関連するエンジンAPIへのアクセス、つまり高プライバシーのハードウェアセンサー。
- ServerCommunication - クロスサーバー通信に関連するエンジンAPIへのアクセス(例:MessagingService)
- Social - 友達や招待などのソーシャル機能に関連するエンジンAPIへのアクセス
- Teleport - テレポートに関連するエンジンAPIへのアクセス
- UI - ユーザーインターフェースに関連するインスタンスへのアクセス
各クラス、プロパティ、メソッド、イベントの機能は、エンジンAPIリファレンス に表示されます。たとえば、Player:GetFriendsOnlineAsync() には、Player および Social 機能が必要です。
いくつかの HttpService メソッドは、スクリプトを実行できる能力を除いて、特に制限なく利用できます:
インスタンスプロパティやメソッドが必要な機能なしにアクセスされると、欠けている機能について説明するエラーが報告されます。
最後に、機能は今日、Robloxエンジン内のすべてのインスタンスを網羅しているわけではありません。このセクションまたは次のセクションにリストされていないインスタンスは、サンドボックス化されたコンテナからの相互作用ができず、Unassigned 機能が現在のスクリプトには利用できないというエラーがスローされます。
追加の制限は、getfenv() と setfenv() 関数がサンドボックス化されたコンテナ内のスクリプトでは利用できないことです。サンドボックス化されたスクリプトからこれらを呼び出すと、次のように報告されます:
現在のスレッドは ['getfenv'/'setfenv'] を呼び出すことができません - ターゲットが現在のサンドボックスで利用できないAPIを使用しています
インスタンスへのアクセスは制限されていますが、インスタンス自体はサンドボックス化されたコンテナ内で引き続き存在し、動作することができます。ライトは明るく、ユーザーインターフェースは見え、既に配線されているオーディオセットが音を再生します。
コンテナ間の相互作用
ネストされたコンテナ
1つのサンドボックス化されたコンテナが別のコンテナ内にネストされると、内側のコンテナのインスタンスは外側のコンテナにはアクセス可能です。
内側のコンテナの機能は、外側のコンテナの機能によって制限されます。 たとえば、外側のコンテナが Basic、Audio、CSG の機能を持ち、内側のコンテナが Basic と Network の機能を持つ場合、実行時に内側のコンテナで利用可能なのは Basic 機能のみです。
内側と外側のコンテナ間に共通の機能がない場合、結果として得られる機能セットは空になります。
バインディング可能な関数とイベント
BindableEvent および BindableFunction は、コンテナと通信する最適な方法を提供し、コンテナが自身が直接使用できない機能でコールバックを実行できるようにします。
イベントが発生するか関数が呼び出されると、接続はそれらを登録した関数のコンテキストで実行されます。これにより、サンドボックス化されたコンテナによって登録されたイベントまたは関数コールバックがそのコンテナの機能で呼び出されます。外部のコードで登録されたコールバックは、サンドボックス化されたコンテナのスクリプトがそれを呼び出すと、あなたの関数の利用可能な機能であなたの関数を実行します。
AccessOutsideWrite 機能がある場合でも、サンドボックス化されたコンテナ内のスクリプトは、サンドボックス化されたコンテナを超える機能セットを持つイベントや関数を呼び出すことはできないことに注意が必要です。
サンドボックス化されたスクリプトが、その祖先機能が自分自身よりも大きいイベントや関数(BindableEvent、BindableFunction、または RemoteEvent)を発火または呼び出そうとすると、エラーでは調査すべきプロパティが名指しされます。
ターゲットがサンドボックス化されていない場合:
現在のスレッドは '<Target>' を発火できません。'<Target>' がサンドボックス化されていないプロパティを設定しているためですが、呼び出しスレッドはサンドボックス化されています。
これを解決するには、ターゲットの Sandboxed を true に設定します。あるいは、呼び出しスレッドのソースを変更して Sandboxed を false に設定できますが、これは推奨されません。なぜなら、サンドボックス化が提供するセキュリティ上の利点を失ってしまうからです。
ターゲットがサンドボックス化されているが、呼び出し側が欠いている機能がある場合:
現在のスレッドは '<Target>' を発火できません。'<Target>' に対して Capability プロパティの追加値が存在します: <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 を持つサンドボックス化されたコンテナが、スクリプトを自身の外部に再親しませることができず、機能が増加しないことを意味します。