こんにちは、そば好きです!
今回は、Roblox Studioのスクリプトで必ず役立つ機能、ランコンテキスト(RunContext)について紹介していきます。
例えば、こんな経験ありませんか?
WorkSpaceにローカルスクリプトを置けたら便利なのに…
Replicated Storageでスクリプトを実行できたらな~…
こんな悩みを解決してくれるのが、ランコンテキスト(RunContext)です。
今回は、そんなランコンテキストの設定方法と使い方を紹介したいと思います。
この記事は、公式のDevForumアナウンスと、独自の検証を元に書きました。
本記事は、Scriptについてある程度理解している初中級者以上のユーザーを対象としています。
Contents
ランコンテキスト(RunContext)とは
RunContextは、スクリプトの動作場所をコントロールすることができる、Scriptのプロパティです。
- Legacy – デフォルト設定(サーバー側で動作する)
- Client – クライアント側で動作するスクリプト
- Server – サーバー側で動作するスクリプト
RunContextプロパティは、コマンドバーやプラグインによってのみ変更できます。セキュリティ上の理由から、Scriptで変更することはできないようになっているようです。
ここで、こんな疑問を持った人もいるのではないでしょうか。
あれ?LegacyとServerの違いは?両方サーバー側で動作するのでは?
普通のLocal ScriptとClientは何が違うの?
結論、スクリプトを実行できる場所の範囲が違います。
RunContextのメリット
RunContextプロパティを設定するメリットは、スクリプトを配置して実行することができる場所の幅が広がることです。
例えば、通常のLocal ScriptではWorkspaceに配置しても、実行されません。なぜならば、Workspaceは本来サーバー側のサービスであるからです。
ですが、RunContextをClientに設定したスクリプトは、Workspaceにクライアント側のスクリプトを配置して、実行することができます。Workspaceの他にも、ほぼすべてのサービスで動作するようになります。
これは、サーバー側のScriptであっても、同じようなことがいえます。
詳しく見ていきましょう。
通常のScript/LocalScriptの場合
まずは、RunContextを設定していない通常のScriptやLocalScriptの場合を見てみます。
- Workspace
- ServerScriptService
- Players
この3つのみです。そのほか、ReplicatedStorageやServerStorageなどでは動作しません。
次に、LocalScriptを見てみます。
- ReplicatedFirst
- PlayerScripts
- PlayerGui
- プレイヤーのCharacterモデル内
- プレイヤーのBackpack内
この5つのみです。そのほか、ReplicatedStorageやWorkspaceなどでは動作しません。
これが、RunContextを知らない場合の今までの常識だったと思います。では、RunContextを使うとどうなるでしょうか?
詳しく見ていきましょう。
RunContextを設定したScriptの場合
いろいろな場所に、RunContextをServerやClientに設定したスクリプトを配置し、どこで動作するのかを検証します。
スクリプトには、3秒間wait()し、script.Parent.Nameをprint()するコードを書いていきます。
wait(3)
print(script.Parent.Name)
検証対象は、以下の9つです。
- Workspace
- ReplicatedFirst
- ReplicatedStorage
- ServerScriptService
- ServerStorage
- PlayerScripts
- StarterPlayerGui
- StarterCharacterScripts
- StarterPack
まずはRuncontextをServerに設定したScriptの検証結果から見てみます。
このように、PlayerScripts以外のすべての場所において、スクリプトを実行することに成功しました。
ちなみに、LunContextがLegacyだと、出力結果はこのようになります。
Workspace、ServerScriptService、そしてPlayers内のスクリプトのみが実行されていることがわかります。
では次に、RuncontextをClientに設定したScriptの検証結果を見てみます。
こちらは、ServerScriptServiceとServerStorageのみ出力されませんでした。
ちなみに、LocalScriptの場合、出力結果はこのようになります。
ReplicatedFirst、PlayerScripts、Backpack、PlayerGui、そしてプレイヤーのcharacterモデル内でスクリプトが実行されたことがわかります。
ちなみに、ここまで見ていただいても分かるように、「Starter」系のコンテナにスクリプトを入れると、元のスクリプトとそのコピーのスクリプトの両方が実行されてしまうため、Roblox公式はStarter系のコンテナにRunContextを使用することを推奨していません。(後ほども紹介します。)
RunContextの活用例
実行できる場所が大幅に広がるのは分かった!でも、なにに使えるの?
主に、アセットの管理や共有がしやすくなることに利点があります。
例えば、Workspaceに、Client側で動かすギミックがあるモデルを配布するとします。
RunContextを使用しない場合は、PlayerScriptsに動かすギミックのLocalScriptを入れる必要があり、管理が複雑になりますし、配布先にはLocalScriptだけPlayerScriptsに移動させる手間が必要になります。
そこで、RunContextを使用すれば、1つのモデルをWorkspaceに入れるだけで、モデルが正しく動作するようになります。1つの場所でモデル全体を管理できるため、管理も配布も簡単になるのです!
ほかにも、クライアント側のスクリプトが多いアスレチックマップなどでも、必須級の機能だといえます。
主に、サーバー側スクリプトではReplicatedStorageやServerStorage、クライアント側スクリプトではReplicatedStorageやWorkspace上でスクリプトが動作するようになるのが、RunContextの大きな利点です!
RunContextのQ&A
ここでは、Roblox公式のアナウンスをもとに、いくつかのQ&Aを紹介したいと思います。
- RunContextを設定すると、プレイヤーはScriptのソースを見ることができるようになりますか?
- いいえ。Scriptのソースをクライアントに複製することはありません。
代わりに、クライアントがScriptを実行する必要がある場合、そのバイトコードを複製します。これは、次の場合にのみ発生します:
・Scriptが LocalScript である
・Scriptが ModuleScript である
・RunContext が Client に設定されているScriptである
追加のセキュリティ対策として、RunContext は Studio のプラグインによってのみ変更できます。エクスペリエンスにバックドアがあったとしても、悪用者はこれを利用して RunContext を変更し、サーバー スクリプトのバイトコードを取得することはできません。
- RunContext は ‘Starter’ コンテナとどのように動作しますか?
- Starterコンテナは、その内容をローカルに複製することによって機能するため、コンテナに含まれるScriptのコピーが作成されます。
Client や Server などのRunContext のいずれかを使用している場合は、元のスクリプトとそのコピーの両方が実行されます。
したがって、これらのコンテナでは、Legacy RunContext または LocalScripts を引き続き使用する必要があります。
- 特定の場所でスクリプトを実行したくない場合はどうすればよいですか?
- 既存の Disabledプロパティを使用して、スクリプトを無効にすることができます。
- Scriptの実行中にRunContext が変更されるとどうなりますか?
- RunContext は、Studioのプロパティ ウィジェットまたはプラグインからのみ変更できます。
スクリプトの実行中に値が変更されると、既存のスレッドが終了し、スクリプトは新しいコンテキストで実行を開始します。
最後に
本記事では、ゲーム開発に役立つRunContextについて紹介しました。
うまく使いこなせると管理がしやすくなり、とても便利な機能だと思うので、ぜひ活用してみてください!
それでは、本記事はここまでにしたいと思います。最後までご覧いただき、ありがとうございました!