roblox-studio-workflow について
roblox-studio-workflowは、Rojoを使うRobloxプロジェクトの開発手順を案内するスキルです。ディスク上でのコード作成、同期、Lint、Studioでのテストに加え、同期や実行時の落とし穴も説明します。
主な機能
- 01Rojoをコードの唯一の基準にする
- 02Studioの編集モードで変更を同期
- 03seleneによるLuauのLint
- 04リモートと観察可能な結果でテスト
- 05データ永続化フィールドを一貫して確認
- 06同期と実行時の問題を診断
活用シーン
- 01Studioテスト前のコード変更の反映
- 02リモート経由でゲーム動作を検証
- 03プレイヤーデータの保存項目を確認
- 04Rojoの同期遅延や起動失敗の診断
MCP 対応
このワークフローでは、Studio MCPを実行中のRobloxゲームのテストと検査に使い、Luauの作成ではなくマップやインスタンスの編集に限定します。利用可能なツールと注意点について、roblox-studio-mcpスキルを参照します。
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ flatbedj/ roblox-skills --skill roblox-studio-workflowインストール後、Claude Code で/roblox-studio-workflowを入力して読み込まれたか確認します。
詳細
Roblox Studio 開発ワークフロー(Rojo + selene + Studio MCP)
Rojo ベースの Roblox プロジェクト向けの、信頼できる開発ループです。コードはディスク上で作成し、Rojo で同期し、Studio MCP でテストします。
基本ルール
- Luau コードはすべてディスク上(
src/)で作成し、MCP 経由で Studio 上では作成しないでください。 Rojo を唯一の信頼できる情報源とします。Studio でスクリプトを編集すると、Rojo の再同期時にインスタンスが重複します(モジュールが2つ作成され、孤立した方は古い状態になります)。MCP はマップ/インスタンスの編集とテスト・調査のみに使用してください。 - インデントには
--!strict+ タブを使用します(プロジェクトの既定のスタイルに正確に合わせてください)。Edit ツールでold_stringが空白文字の不一致により失敗する場合、そのファイルはタブを使用しています。先頭のタブを正確にコピーしてください。 - 変更のたびにリントし、問題のない状態を保ってください。 通常、このプロジェクトでは selene を使用します(
selene srcまたは~/.rokit/bin/selene src)。目標は エラー0件/警告0件/解析エラー0件です。selene では、実行時に起きる大きな落とし穴を2つ検出できません。以下の注意事項を参照してください。
同期サイクル(重要 — ここを間違えると古いコードをテストすることになります)
Rojo がパッチを適用するのは Studio が編集モードのときだけで、プレイ中には適用されません。 プレイ中に行った編集はキューに入り、プレイを停止したときに反映されます。そのため、ディスク上の変更をテストするには次の手順を実行してください。
start_stop_play→ 停止(is_start: false)- Rojo がパッチを反映するまで約10~15秒待ちます(この手順は省略しないでください。すぐに再開すると古いコードが実行されます)
start_stop_play→ 開始(is_start: true)get_console_output→ テスト前にクリーンな起動を確認します
Rojo プラグインの WebSocket 接続が通知なく切断された場合(コンソールに [Rojo-Warn] Disconnected と表示されます)、ユーザーがプラグインを再接続するまで何も同期されません。インスタンスが重複した場合は、Rojo プラグインで Disconnect を選択し、同期されたルート(例:ReplicatedStorage.Shared、ServerScriptService.Server、StarterPlayerScripts.Client)を削除してから、Connect を一度だけ選択し、クリーンな状態で再構築してください。
実行中のゲームのテスト(Studio MCP 経由)
MCP を通じてゲームを操作します。ツールと注意点については roblox-studio-mcp スキルを参照してください(datamodel_type、別 VM ルール、キャプチャ/入力の癖、リンク切れの修正)。テストの戦略は次のとおりです。
- モジュールの状態ではなく、ゲーム独自のリモートを通じて操作してください。
execute_luauは別の Lua VM で実行されるため、requireしたモジュールは新しいコピーになり、そこでPlayerData.get(plr)を呼び出しても nil が返されます。代わりに、ゲームの RemoteFunctions/Events(Net.func("X"):InvokeServer(...)や Admin/デバッグ用リモート)を呼び出すか、インスタンスを直接読み書きしてください。FireAllClientsはServerデータモデルから実行する必要があります。 - モジュールの内部状態ではなく、観測可能な副作用を検証してください。
PlayerGui:GetDescendants()を走査して、ラベルの.Text、アクセサリーの数、ImageLabel.Imageをアサートします。純粋なヘルパーは、execute VM で合成入力を使ってユニットテストできます。 - 副作用のあるループは、実際のクールダウンに合わせて間隔を空けてください。 サーバー側のクールダウンがあるアクションを短時間に連続して呼び出すと拒否され、失敗として認識されます。間隔を空けて呼び出してください。
- テストを信頼する前に
get_console_outputでクリーンな起動を確認してください(200個のローカル変数の上限超過や、停止したWaitForChildのような、通知のない失敗を検出できます)。
エンジン/言語に関する注意点(seleneでは検出されません。実行時に問題になります)
- 大きなメインチャンクでのローカル変数の上限は200個です(例:
init.client)。トップレベルにlocalを追加すると、実行時に**「Out of local registers: exceeded limit 200」**が発生します(seleneでは検出されず、起動が無言で失敗します)。対処法:関連する状態を1つのテーブルローカルにまとめる(local ui = {}の後にui.x、ui.yを使う)、モジュール参照をテーブルフィールドに格納する(ui.mod = require(...))、一連の処理をdo … endで囲む、または一度しか使わないローカル変数をインライン化します。関数本体やクロージャ内のローカル変数は、メインチャンクの上限に数えられません。 - seleneと新しいクラス: クラスがseleneのリストにない場合(非常に新しいInstance型など)、
Instance.new("SomeNewClass")はseleneの標準ライブラリチェックに失敗します。インスタンスがサービスによって自動作成される場合は、Instance.newの代わりにFindFirstChildOfClass/FindFirstChildで取得し、プロパティを設定してください。 - UI固有の落とし穴は
roblox-ui-hudスキルにあります — フォントのグリフ(✕→X、国旗の絵文字は使用しない)、UI外のクリックで閉じる動作、横向きUIListLayoutの順序、UDim2.fromScaleのリント、ブール値の可視性に関するバグです。UI/HUD関連の作業では、このスキルを読み込んでください。
PlayerDataの永続化チェックリスト(データの消失が気づかれないまま起きる典型的な原因)
保存するフィールドごとに、以下のすべてを確認してください:型注釈 · デフォルト値(初期化) · シリアライズ · 読み込み · リセット。保存されても読み込まれないフィールドは、再参加時に無言で初期値に戻り、その後の自動保存で初期値が書き戻されて、データが永久に失われます。新しいステータス/アップグレードキーを追加した場合は、読み込み関数をgrepして復元されていることを確認してください(新しいキーにも対応できるよう、保存されたサブテーブルをループ処理する方法がおすすめです)。
(Studio自体の操作 — Luauの実行、スクリーンショットの撮影、アセットの生成、画像のアップロード、切れたMCPリンクの修正 — はroblox-studio-mcpスキルを使用します。)