多くの開発者にとって、Robloxスクリプティングに適応する際の基本的な課題は、ファイルの位置と Script.RunContext プロパティの重要性です。スクリプトの種類、Explorer内の位置、実行コンテキストによって、スクリプトは非常に異なる動作をする可能性があります。特定のメソッド呼び出しが失敗することや、ゲーム内のオブジェクトにアクセスできなくなること、あるいはスクリプトが全く実行されないこともあります。
この複雑さの理由は、Robloxゲームがデフォルトでマルチプレイヤーであることです。スクリプトは、サーバーのみで実行する、クライアントのみで実行する、または両方で共有する能力が必要です。時間の経過とともにRobloxプラットフォームの進化が、この状況をさらに複雑にしました。
スクリプトの種類
Robloxには3種類のスクリプトがあります:
- Script - サーバーまたはクライアントのいずれかで実行されるコードですが、その位置と Script.RunContext プロパティに依存します。
- LocalScript - クライアントのみで実行されるコードです。実行コンテキストはありません。
- ModuleScript - 他のスクリプトで再利用できるコードです。実行コンテキストはありません。
Scriptを作成すると、そのデフォルトの実行コンテキストは Legacy です。つまり、a) サーバーサイドスクリプトであり、b) Workspace や ServerScriptService などのサーバーコンテナ内にある場合のみ実行されます。
- スクリプトの実行コンテキストを Server に変更すると、ReplicatedStorage 内でも実行できるようになりますが、これは推奨されません。その場所の内容はクライアントに複製されるため、サーバーサイドスクリプトには不適切な場所です。
- スクリプトの実行コンテキストを Client に変更すると、ReplicatedStorage の中で実行でき、StarterCharacterScripts や StarterPlayerScripts 内でも実行できます。ただし、スタートコンテナはクライアントにコピーされるため、元のスクリプト と コピーが実行されることになり、望ましくありません。
スクリプトの実行コンテキストを変更するには、Explorerでそれを選択し、Propertiesウィンドウで値を変更します。

推奨事項
クライアントスクリプトは、ReplicatedStorage に RunContext を Client にして配置し、クライアント専用の ModuleScripts と一緒に使います。
Studioでデバッグする際は、Outputウィンドウの行をクリックし、ランタイムでスクリプトがコピーされた一時的な場所ではなく、スクリプトの安定した場所である ReplicatedStorage.YourScript に移動できます。
サーバースクリプトは、ServerScriptService に RunContext を Server にして配置し、サーバー専用の ModuleScripts と一緒に使います。
サーバーとクライアントのスクリプト間でコードを共有するには、ReplicatedStorage 内の ModuleScripts を使用します。
最小限のクライアントスクリプト(ローディングスクリプトなど)を ReplicatedFirst に RunContext を Client にして配置します。詳細については、Replication orderを参照してください。
StarterCharacterScripts、StarterPlayerScripts、StarterGui、および StarterPack では LocalScripts を使用します。
スクリプトの場所
| Location | Description |
|---|---|
| Workspace | ゲームの3Dワールドを表します。この場所は、オブジェクトに直接接続してその動作を制御するサーバースクリプトに適しています。 |
| ReplicatedFirst | 他のものの前にクライアントに複製されるオブジェクトを含みます。この場所は、ローディング画面を表示するために必要なオブジェクトとクライアントスクリプトの絶対最小セットに最適です。 |
| ReplicatedStorage | クライアントとサーバーの両方に複製されるオブジェクトを含みます。この場所は、サーバーとクライアントの両方で使用するModuleScriptsに最適です。LocalScriptsはこの場所からは実行されませんが、RunContextがClientのScriptsは実行されます。 |
| ServerScriptService | サーバースクリプトを含みます。この場所は、ゲームのロジックやクラウドストレージなど、サーバー側の機能やオブジェクトにアクセスする必要があるスクリプトに最適です。 |
| ServerStorage | サーバー側のオブジェクトを含みます。この場所は、ゲームに参加したときにクライアントに即座に複製する必要のない大きなオブジェクトに最適です。スクリプトはこの場所からは実行されませんが、ここにサーバー側のModuleScriptsを格納することができます。 |
| StarterPlayer ⟩ StarterCharacterScripts | キャラクターがスポーンする際に実行されるLocalScriptsを含みます。 |
| StarterPlayer ⟩ StarterPlayerScripts | プレイヤーがゲームに参加したときに実行される一般的なLocalScriptsを含みます。 |
| StarterGui | クライアントがゲームをロードするときに表示するGUI要素を含みます。LocalScriptsはこの場所から実行できます。この場所は、ボタン、メニュー、ポップアップを追加するなど、ゲームのユーザーインターフェースを変更するスクリプトに最適です。 |
| StarterPack | 一般的にはToolsのみを含みますが、プレイヤーバックパックを設定するためのLocalScriptsを含むこともできます。 |
この画像は、どの Explorer ウィンドウの場所がクライアントスクリプトを含むことができるかを示しています。ReplicatedFirst と ReplicatedStorage には Scripts が RunContext を Client に設定して含むことができますが、Starter[] コンテナは LocalScripts を使用する必要があります。

例プロジェクト構造
Plantリファレンスプロジェクトは、大規模で複雑なゲームでコードをどのように整理できるかを示しています。
特に注目すべきは、ほとんどのコードを再利用可能な ModuleScripts として ReplicatedStorage および ServerStorage に格納している点です。