【Roblox】RunContext が Legacy 以外になっている Script を Rojo で同期する方法

Roblox

はじめに

RunContext が Legacy 以外になっている Script を Rojo で同期する際に少しつまずいたのでその方法をメモしておきます。

この記事での環境は以下の通りです。

  • OS:Windows 11
  • Roblox Studio:Version 0.714.1.7141099 (64bit)
  • Rojo(Visual Studio Code):2.1.2
  • Rojo(Roblox Studio):7.7.0-rc.1

RunContext とは

そもそも RunContext とは何でしょうか?
RunContext とは Script で設定することのできるプロパティの1つで、その Script が実行されるコンテキストを変更することができます。

現在、RunContext で選択できる値は Legacy、Server、Client、Plugin の4つであり、初期値は Legacy になっています。

RunContext は BaseScript というクラスで定義されており、Script も LocalScript も BaseScript を継承しているため、内部的には LocalScript も RunContext を保持していますが、Script と違って LocalScript は RunContext を変更することができません。
以下のコードを実行すると「Enum.RunContext.Legacy」と表示されるため、LocalScript は内部的には初期値の Legacy のままになっています。

local localScript = Instance.new("LocalScript")
print(localScript.RunContext)

RunContext の登場前は、サーバー側で実行したい処理は Script に書いてサーバー用の場所(Workspace や ServerScriptService など)に置き、クライアント側で実行したい処理は LocalScript に書いてクライアント用の場所(StarterCharacterScripts や StarterPlayerScripts など)に置く必要がありました。
つまり、とある Script と LocalScript が1つの機能に関連したものであったとしても、それらを同じ場所にまとめて置くことができず、リソースの共有や管理などが複雑になってしまっていました。

しかし、RunContext の登場によってサーバー側で実行したい処理も、クライアント側で実行したい処理も Script として1つの場所にまとめて置けるようになりました。
また、もし今後 Script と LocalScript 以外のものが登場したとしても Roblox Studio 側では Script の RunContext を変更するだけで良くなるため、拡張性も以前より向上しました。
(現に RunContext の公式アナウンスのあった2022年8月時点では RunContext は Legacy、Server、Client の3つのみでしたが、2025年1月頃に Plugin が正式に追加されました。)

RunContext が Legacy 以外になっている Script を Rojo で同期する際の問題点

Rojo を使ってローカルの .lua ファイルと Roblox Studio 側のコードを同期する際、Script は「{スクリプト名}.server.lua」、LocalScript は「{スクリプト名}.client.lua」、ModuleScript は「{スクリプト名}.lua」というファイル名にします。
Script の RunContext を Client にしたとしても、Script から LocalScript に変わるわけではないのでローカル上の .lua ファイルのファイル名は「{スクリプト名}.server.lua」にします。

しかし、この状態で Roblox Studio と接続しようとするとこの画像のように RunContext の部分で差分が生じてしまいます。
この画像のように「Incoming」が0の状態で「Accept」を押すと既存の Script の RunContext が Legacy になってしまいます。

その「{スクリプト名}.server.lua」に対応する Script が Roblox Studio 側に無い場合は RunContext が Legacy な Script が作成されてしまいます。

RunContext が Legacy 以外になっている Script を Rojo で同期する方法

これの対処法は主に2つあります。

.meta.json で RunContext を指定する

1つ目は .meta.json で RunContext を指定するという方法です。

「{スクリプト名}.server.lua」というファイルがある場合は「{スクリプト名}.meta.json」というファイルを同じディレクトリに作成してそれの内容を以下のようにします。
(Plugin や Server の場合も同じです。)

{
    "properties": {
        "RunContext": "Client"
    }
}

その Script がフォルダの役割も兼ねている場合(Roblox Studio でその Script の中に他のインスタンスが格納されている場合)はスクリプト名のフォルダの中の init.meta.json を上記のように変更します。

これで RunContext で差分が生じることなく同期することができました!

emitLegacyScripts を false に変更する

2つ目は emitLegacyScripts を false に変更するという方法です。

以下のようにして default.project.json に「”emitLegacyScripts”: false,」を追加します。

{
  "name": "PlaceName",
  "emitLegacyScripts": false,
  "tree": {

すると、Rojo が Roblox Studio 側で LocalScript や、RunContext が Legacy に設定された Script を作成しなくなり、RunContext が Server か Client に設定された Script のみを作成するようになります。
同期したい既存の Place に LocalScript がなく、ModuleScript 以外すべて Script で作られている場合や、LocalScript ではなく Script で統一する予定の新規 Place を同期する場合はこちらの方法の方が良いかもしれません。

最後に

参考

フォーラム

公式APIドキュメント

お問い合わせ

    タイトルとURLをコピーしました