スクリプトカプションは、 Class.DataModel サブツリー内のスクリプトが実行できるコントロールを提供するシステムです。エクスペリエンススクリプトをより良く制御するために、他のスクリプトが実行できるコントロールを提供します。
- このシステムは、ツールボックスから取得できるモデルの制限を設定し、スクリプトを含むユーザー生成コンテンツをエクスペリエンス内に含めることを簡単にします。
- また、プレイヤーが自分のコードを実行できる、柔軟で仮想環境のようなエクスペリエンスのより良いセキュリティを確保することもできます。
- また、自分が何をすることができるかに制限を設定するライブラリを共有するためにも使用できます。たとえば、追加の数学メソッドを提供するライブラリは、そのライブラリを使用する他の開発者には、コードベース全体を検証する必要がないように、最小限に制限できます。
スクリプトの機能を有効化
この機能を有効にするには、 SandboxedInstanceMode 設定を Default から Experimental に変更し、 2>Esplorer2> で 5>Experimental5> を有効にします。
クライアントのベータテストが完了したとき、このステップは必要なくなります。
サンドボックスコンテナ
このシステムは、 サンドボックスコンテナ の概念を紹介します。Model、Folder、1> Class.Script1> またはそのクラスの後継者のいずれかの
Class.Instance.Sandboxed|Sandboxed プロパティは、DataModel ツリの中のサンドボックスコンテナとしてインスタンスを指定し、スクリプト内のスクリプトが Capabilities プロパティの設定に基づいて実行できるアクションを制限します。
機能
プロパティ Capabilities は、実行のさまざまなアセプトを制御する 4つのグループに分割された値のセットです:
- 実行コントロール - スクリプトがクライアントまたはサーバーで実行できるかどうかを指定します
- インスタンスアクセスコントロール - スクリプトがインタラクトできる DataModel パーツを指定します
- スクリプト機能コントロール - ルアウのスクリプトを呼び出すことができる機能のスペックを指定します
- エンジン API アクセスコントロール - Roblox Engine 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つの機能が含まれています:
- RunClientScript - LocalScript または Script で、0> Class.BaseScript.RunContext|RunContext0> の値が含まれる 3> Class.EnBaseScript 3> をクライアントで実行することができます
スクリプトが Enabled であり、起動する場所に対応するカプシティは使用できませんが、 出力 ウィンドウに警告メッセージが表示されます。スクリプトがそのコンテキストで実行されるべきでない場合は、無効にするまたは1>削除する1>こと。
これらの実行機能を必要とするためには、ModuleScripts では必要ありません。
スクリプトが実行コントロール機能が欠落しているためにスタートできない場合、出力に警告として報告されます。たとえば、次のように:
Cannot start server script 'Script' (lacking capability RunServerScript)
インスタンスアクセスコントロール
このセットには、単一の能力のみが含まれています:
- AccessOutsideWrite - スクリプトは、サンドボックス容器からインスタンスを取得し、受信することができます
機能が利用可能でない場合、スクリプトは自分のサンドボックス容器内のインスタンスのみを参照できます。たとえば、スクリプトがサンドボックス容器内に直接配置されている場合、script.Parent.Parent は nil を返します。
さらに、Roblox API イベントがサンドボックスのコンテナ外の Class.Instance でパスする場合、<a href="https://developer.roblox.com/en/ documentation/getting-started/roblox-api-first-hand">Roblox</a> は、<a href="https://developer.roblox.com/en/development
この機能を設定しないでください;サンドボックスは、スクリプトがエクスペリエンス内の任意のインスタンスとインタラクトできる場合、保証は弱まります。
サービスへのアクセス
AccessOutsideWrite なしでも、サンドボックスのコンテナ内のスクリプトはまだ game 、workspace 、およびサービスにアクセスできます。このアクセスは、スクリプトがグローバルのメソッドを使用するように、子インスタンスを通じて再評価され
インターンにパスされたインスタンス
Roblox API を通過しない関数コールを通過するインスタンスの場合、参照は保持されます。しかし、ModuleScript がこの方法でパスされる場合、AccessOutsideWrite なしでは、ModuleScript にはなりません。これは、2>Class.ModuleScript2> の
スクリプト機能コントロール
このセットのコントロールは、スクリプトの一般的なアセプトを制御します:
- アセット要求 - スクリプトは、アセット ID で require を呼び出すことができます
- LoadString - スクリプトは loadstring を呼び出すことができます
- CreateInstances - スクリプトは、Instance.new、Instance.fromExisting、または 0> Class.Instance:Clone0> を使用して、新しいインスタンスを作成できます。
デフォルトの機能制限が引き続き適用されることをご了承ください。 even if LoadString が有効になっている場合でも、エクスペリエンスはまだ ServerScriptService で有効化する必要があり、サーバー上でのみ利用可能です。
新しいインスタンスを作成するには、 CreateInstances 以外に、そのインスタンスにアクセスできる追加のエンジン API 機能が必要です。
エンジン API アクセスコントロール
この最後のグループのコントロールスクリプトは、さまざまなエンジン API にアクセスできます:
- ベーシック - 単一インスタンスと必要なビルディングブロックへのアクセス
- オーディオ - オーディオ API に関連するインスタンスへのアクセス
- データストア - データストアとメモリストア API へのアクセス
- ネットワーク - HTTP ネットワーク API へのアクセス
- 物理学 - 物理学に関連するインスタンスへのアクセス
- UI - ユーザーインターフェイスに関連するインスタンスへのアクセス
- CSG : 建設的なソリッドジオメトリに関連するインスタンスと関数にアクセス
- チャット : インエクスペリエンスチャットに関連するインスタンスへのアクセス
- アニメーション : アニメーションに関連するインスタンスへのアクセス
- アバター : アバターに関連するインスタンスへのアクセス
- 入力 : ユーザーの入力に関連するインスタンスへのアクセス
- 環境 : 環境の表示に関するコントロールの有効化に関連するインスタンスへのアクセス
- リモートイベント : インターネットワークの内部ネットワークオペレーションへのアクセス
スクリプトを実行できるだけでなく、実行できるすべての機能を持つインスタンスもあります。これには、次のメソッドが含まれます: HttpService メソッド:
インスタンスプロパティまたはメソッドにアクセスすると、必要な能力がないことを記述するエラーが発生します。
最後に、Roblox エンジンの今日のすべてのインスタンスを覆うことはできません。このセクションまたは次のセクションにリストされていないインスタンスは、サンドボックスコンテナからのインタラクションのために利用可能ではありません。
追加の制限は、 getfenv と setfenv 機能は、サンドボックスコンテナ内のスクリプトには使用できません。
スクリプトアクセスインスタンスにのみ制限がかかります。インスタンス自体はまだ存在し、サンドボックス内で自動的に実行されます。ライトはまだ存在し、ユーザーインターフェイスはまだ表示され、オーディオ設定はまだワイヤーされています。
エンジン API 能力割り当て
ここには、インスタンスとメソッドのリスト (インスタンスの機能と異なる場合) があります:
ベーシック * Attachment
- Class.Part、MeshPart、CornerWedgePart、0> Class.TriangleMeshPart0>、3> Class.WedgePart3>、6> Class.TrussPart6>、Part9>
データストア * DataStore、OrderedDataStore、GlobalDataStore
- Class.DataStoreGetOptions , DataStoreIncrementOptions , DataStoreInfo , 0> Class.DataStoreKey0> , DataStoreGetOptions3> , 6> Class.DataStoreObjektVersion
ネットワーク * Class.HttpService:GetAsync , HttpService:RequestAsync() , HttpService:PostAsync() , 0> Class.HttpService:UrlEncode0> , HttpService:GetAsync()3>
UI * BasePlayerGui , PlayerGui , BillboardGui , 0> Class.GuiBase0> ,
- Class.Executor , TextButton , TextFilterResult , 0> Class.TextFilterTranslatedResult0> , 3> Class.TextLabel3> , 6> Class.TextService6> , TextBox9>
CSG * GeometryService
- Class.IntersectOperation ( 基本 、NegateOperation (0> 基本0>、3> Class.PartOperation3> (6> 基本6>、IntersectOperation9> (IntersectOperation2>、5> Class.IntermediateOperation
チャット * BubbleChatConfiguration , BubbleChatMessageProperties
- Class.TextChannel , TextChatCommand , TextChatConfigurations , 0> Class.TextChatMessage0> , 3> Class.TextChatMessageProperties3> , 6> Class.TextChatService6> , TextChannel9>
アニメーション * Bone ( 基本 も必要)
- Class.Animation , AnimationClip , AnimationClipProvider , 0> Class.AnimationContainer0> , 3> Class.AnimationRigData3> , 6> Class.AnimationTrack6> , Animation9>
アバター * Accessory、AccessoryDescription
環境 * Atmosphere , Clouds , Lighting , 0> Class.Sky0>
- Class.BloomEffect 、BlurEffect 、ColorCorrectionEffect、0> Class.ColorGradingEffect0>、3> Class.DepthOfFieldEffect3>、6> Class.PostEffect6>、BloomEffect9>
リモートイベント * BaseRemoteEvent 、 RemoteEvent、 UnreliableRemoteEvent
コンテナ間のインタラクション
ネストされたコンテナ
1つのサンドボックスコンテナが別のコンテナにネストされると、内部コンテナのインスタンスは外部コンテナにアクセスできます。
内のコンテナは、外のコンテナの機能により制限されます。たとえば、外のコンテナに ベーシック 、 オーディオ 、および CSG がある場合、内のコンテナに 2>ベーシック2> 、 5>ネットワーク5> 、および <
内部と外部のコンテナ間に共通の機能がない場合、結果として機能セットは空です。
バインド可能な関数とイベント
BindableEvent と BindableFunction は、コンテナとコミュニケーションする最良の方法を提供し、 Class.Bindable 自体が直接使用できない能力を含むコールバックを実行することを許可します。
イベントまたは関数が発動すると、コネクションは関数のコンテキストで実行されます。これは、サンドボックスコンテナによってイベントまたは関数のコールバックが登録された場合、コールバックはそのコンテナの機能を実行するようになります。コールバックが外のコードによって登録された場合、サンドボックスコンテナのス
アクセスアウトサイドライト 機能を有効にしていても、サンドボックスのコンテナ内のスクリプトは、コンテナ自体のより大きな能力を持っている場合、コンテナ外のイベントや関数を呼び出すことはできません。
モジュール要求
内部 ModuleScripts は通常、サンドボックスコンテナによって要求されることができます。しかし、ターゲットインスタンスがコンテナの外にある場合は、ModuleScript は、コンテナに利用可能な能力セットが小さくなっているか、コンテナに利用可能な能力と同等である場合にのみ要求
この制限は RunClientScript と RunServerScript 機能には適用されません。ModuleScript がコンテナに入っているだけで 1> RunClientScript1> が必要ですが、4> RunServerScript4> 機能を持つスクリプトで成功して実行することができます。
関数を直接呼び出す
サンドボックス容器の ModuleScript からサンドボックス外に必要な場合、いくつかの保護は利用できません。特に、ターゲット機能は、コールアーに利用可能なすべてのインスタンスにアクセスできます。如果コールアーがサンドボックス容器にない場合、 AccessOutsideWrite が利用可能に
他のコンパシビリティ制限がまだ適用されます。データストアアクセス可能性がある場合でも、ターゲットモジュールがそうでない場合は、DataStore メソッドを呼び出すことはできません。しかし、自分の
インスタンスはターゲットモジュールにパスされたり、モジュールフィールドに割り当てられたりすることができます。
必要に応じて、rawset を使用して、テーブルのメンバーを割り当てることをお勧めします。これにより、__index / __newindex メタメソッドがテーブルに設定されるのを避けることができます。
全体的なお勧めは、BindableEvent と BindableFunction をできるだけ頻繁にコミュニケートすることです。
インスタンスの移動
ほとんどのインスタンスには、コンテナ間の移動に制限がありません。しかし、スクリプトインスタンスは、同じセットの機能を持つコンテナにのみ移動できます。
これは、 AccessOutsideWrite を持つサンドボックスコンテナでスクリプトを外部にリファレンスできないことを意味します。