关于 roblox-studio-workflow
roblox-studio-workflow 为基于 Rojo 的 Roblox 项目提供开发流程指南,涵盖磁盘上的代码编写、同步、静态检查和 Studio 测试,并说明常见同步及运行时问题。
主要功能
- 01以 Rojo 作为代码唯一来源
- 02在 Studio 编辑模式同步更改
- 03使用 selene 检查 Luau
- 04通过远程对象和可观察结果测试
- 05端到端核对数据持久化字段
- 06排查同步与运行时问题
适用场景
- 01在 Studio 测试前应用代码更改
- 02通过远程对象验证游戏行为
- 03检查玩家数据保存字段
- 04诊断 Rojo 同步过期或启动失败
MCP 相关
该流程使用 Studio MCP 测试和检查运行中的 Roblox 游戏,并将 MCP 限定用于地图或实例编辑,而非编写 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 重新同步时产生重复实例(模块会有两个副本;孤立副本会变得过时)。MCP 仅用于编辑地图/实例,以及测试和检查。 - 缩进使用
--!strict+ 制表符(严格遵循项目的既定风格)。如果 Edit 工具的old_string因空白字符不匹配而失败,说明文件使用了制表符——请复制完全一致的前导制表符。 - 每次更改后都运行 lint,并保持无问题: 项目通常使用 selene(
selene src或~/.rokit/bin/selene src)。目标是 0 个错误 / 0 个警告 / 0 个解析错误。selene 无法发现两个重要的运行时陷阱——见下方的注意事项。
同步周期(关键——出错就会测试过时的代码)
Rojo 只会在 Studio 处于编辑模式时应用补丁,游玩期间不会。 游玩时进行的更改会排队,等游玩结束后才会生效。因此,要测试磁盘上的更改:
start_stop_play→ 停止(is_start: false)- 等待约 10–15 秒,让 Rojo 完成补丁同步(不要跳过这一步——快速重启会运行过时的代码)
start_stop_play→ 启动(is_start: true)get_console_output→ 确认启动过程无异常后再测试
如果 Rojo 插件的 websocket 静默断开(控制台中出现 [Rojo-Warn] Disconnected),在用户重新连接插件之前,任何内容都不会同步。如果出现重复实例:在 Rojo 插件中选择 Disconnect → 删除已同步的根节点(例如 ReplicatedStorage.Shared、ServerScriptService.Server、StarterPlayerScripts.Client)→ 重新连接一次,以干净地重建。
测试正在运行的游戏(通过 Studio MCP)
通过 MCP 操控游戏——有关工具及其注意事项(datamodel_type、独立 VM 规则、捕获/输入方面的问题、死链接修复),请参阅 roblox-studio-mcp 技能。测试策略:
- 通过游戏自身的远程对象操控游戏,而不是读取模块状态。
execute_luau在独立的 Lua VM 中运行,因此require的模块是新副本,在该环境中调用PlayerData.get(plr)会返回 nil。应改为调用游戏的 RemoteFunctions/Events(Net.func("X"):InvokeServer(...)、Admin/调试远程对象),或直接读取/写入实例。FireAllClients必须从Server数据模型运行。 - 通过可观察到的副作用验证,而不是检查模块内部状态。 对标签的
.Text、配饰数量,以及遍历PlayerGui:GetDescendants()时的ImageLabel.Image进行断言。纯辅助函数可以使用合成输入在 execute VM 中进行单元测试。 - 让会产生副作用的循环遵守实际冷却时间——服务器冷却中的操作会拒绝快速调用,这会看起来像是测试失败。请拉开调用间隔。
- 先用
get_console_output确认启动过程无异常,再相信测试结果(这可以发现诸如超出 200 个局部变量上限或卡在WaitForChild等静默故障)。
引擎/语言注意事项(selene 检查不到这些问题——它们会在运行时引发故障)
- 大型主代码块中的局部变量上限为 200 个(例如
init.client):添加顶层local会在运行时抛出 "Out of local registers: exceeded limit 200"(selene 检查不到,启动会悄无声息地失败)。解决方法:将相关状态打包到一个表局部变量中(local ui = {},然后使用ui.x、ui.y),将模块引用挂到表字段上(ui.mod = require(...)),用do … end包住一组代码,或内联只使用一次的局部变量。函数体/闭包中的局部变量不计入主代码块。 - selene 与较新的类: 如果某个类不在 selene 的列表中(例如非常新的 Instance 类型),
Instance.new("SomeNewClass")会未通过 selene 的标准库检查。如果该实例由其服务自动创建,请改用FindFirstChildOfClass/FindFirstChild查找实例并设置属性,而不是使用Instance.new。 - UI 专属陷阱见
roblox-ui-hud技能——字体字形(✕→X,不要使用旗帜 emoji)、点击外部区域关闭、水平UIListLayout顺序、UDim2.fromScalelint,以及布尔值可见性 bug。进行任何 UI/HUD 工作时都应加载该技能。
PlayerData 持久化检查清单(静默数据丢失的常见原因)
对于每个保存的字段,确认以下各项全部齐备:类型注释 · 默认值(初始化)· 序列化 · 加载 · 重置。字段已保存却未加载,会在玩家重新加入时悄悄重置;随后下一次自动保存会将重置后的值写回,造成永久性数据丢失。添加新的属性/升级键时,请 grep 加载函数,确保它会恢复该键(最好遍历已保存的子表,让新键也能自动兼容)。
(直接操作 Studio——运行 Luau、截图、生成资源、上传图片、修复失效的 MCP 链接——请使用 roblox-studio-mcp 技能。)