Studio / ROBLOX
Roblox Studio 客户端与服务器:比较测试中的状态
辨认当前观察的是哪一侧,找到具体对象,并把 Explorer 记录与 Output 对照。使用练习标记、明确记录,以及停止后的检查步骤。
提出准确的状态问题 #
“对象变了”不足以分析问题。先说明在哪里看到变化:客户端画面、服务器层级,还是日志。选择独立原型中无害的元素,例如名为 ContextMarker 的锚定 Part。不要用金币、购买或玩家保存数据作为练习指示器。
本文的问题是:“同一测试中,两侧分别观察到什么属性值?”这与比较多个玩家或验证跨次登录保存不同。先记录 Workspace → ContextMarker,以及一个属性,例如 Color。标记是练习建议;本文没有修改我们的游戏,也没有实际运行 Studio 测试。
启动合适的测试模式 #
在测试菜单中选择 Test 或 Test Here 并启动模拟。文档说明,这些单人模式运行独立的客户端和服务器模拟。Test 会加入角色,Test Here 使用当前摄像机前方的位置。本练习不需要同时打开多个客户端窗口。
不要未经比较就用 Run 替代普通玩家流程:Run 不会加入玩家角色。观察前记录模式和初始条件。如果原型依赖角色,应检查角色是否出现。两个不同模式的记录可能只是启动条件不同,因此先保持一套固定配置。
确认当前观察的一侧 #
单人测试期间使用 Client/Server 切换按钮。它的状态说明当前观察哪一个模拟。读取属性前记录这一侧,切换后再次确认。摄像机靠近同一物品,并不表示上下文相同;相似的世界画面仍然可能属于不同侧。
记录可以标成“Client”和“Server”,保留 Studio 中的名称。没有标注侧别的层级截图,之后容易与其他观察混淆。本文示意图的两个面板表示上下文,不代表实际运行的两名玩家。它们不是 Studio 截图,也不是运行中项目状态的证明。
按完整路径寻找对象 #
在 Client 模式打开 Explorer,找到选定路径。切换到 Server 后检查同一路径和属性。核对父对象与名称:另一个模型中的 ContextMarker 是另一个对象。如果找不到元素,就记录缺失,而不是填写想象中的预期值。
上下文不同,层级也会不同。Roblox 文档展示了客户端 PlayerScripts,以及服务器 ServerScriptService 和 ServerStorage。对象存在于服务器存储,不代表客户端一定可访问。开启 streaming 时,客户端初始也可能只收到部分 Workspace;这与名字拼错是不同的问题。
保存初始的一对观察 #
修改前写下两行:Client、完整路径、观察值;Server、相同路径、观察值。加入观察时间或场景步骤。没有实际读取两边之前,不要宣布数值一致。本文表格提供记录格式,并不是我们已经完成的测试日志。
如果初始就不一致,先检查是否有现有脚本修改属性,或者是否比较了不同对象和时间。不要在尚未解释的初始状态上继续增加新行为。独立而简单的原型更适合练习,因为可以辨认哪些因素可能影响标记的所选属性。
只改变一件事再比较 #
在独立练习测试中选 Client,通过 Properties 只编辑标记的一个观察属性。立即记录修改发生在哪一侧,再读取两侧值。目的是区分操作位置与观察位置,不是证明 Roblox 所有属性都遵循一个相同规则。
停止测试,恢复初始条件,再单独比较 Server 侧修改。不要把两个变化混在没有记录的流程里:脚本、延迟或下一次编辑都可能影响观察。结果与预期不同,应保留两侧记录和条件,而不是根据一次颜色变化就判定复制损坏。
与 Output 对照 #
打开 Output,注意消息来自哪一侧。Roblox 文档使用蓝色标记表示客户端、绿色表示服务器;ModuleScript 消息的侧别取决于调用者。颜色是辅助线索,但分析还需要消息内容,以及指向来源的路径。
如果原型已有诊断输出,把消息时间和对象与 Explorer 记录对照。只有“完成”而没有相关侧别或值的消息,说明不了多少。在虚构案例中,界面显示“已选择”,但日志针对另一个对象。文字相似不能证明服务器确认了这一次操作。
检查脚本类型与位置 #
缺少预期消息时,查看脚本类型、所在位置,以及 Script 的 RunContext。一个图标或 Script 名称不能单独决定执行侧。Roblox 的位置指南说明,Script 根据上下文与位置可在客户端或服务器执行,LocalScript 则属于客户端。
不要为了出现 Output 消息而随意移动正常工作的脚本。先保存路径和设置,再与官方位置指南比较。ModuleScript 还需要考虑调用者。移动代码可能产生额外执行或新问题,所以每次变更都应单独观察,而不是连续尝试后只记最后结果。
| 检查项目 | 重要原因 |
|---|---|
| Script | 位置与 RunContext |
| LocalScript | 客户端上下文和适当位置 |
| ModuleScript | 调用模块的一侧 |
区分停止与保存 #
Stop 结束模拟,并将对象恢复到测试之前的状态。停止后在编辑模式再次检查初始标记。只在模拟中看到的变化,不会自动成为已保存的项目修改。记录编辑实际发生的位置,不要从暂时画面推断永久保存。
本练习没有验证 DataStore、购买,或重新进入已发布游戏后的状态。成功比较两侧上下文,也不证明数据跨会话保存。那些问题需要有适当来源和条件的独立场景。不要在颜色观察记录中加入未经检查的永久保存结论。
写出有边界的结论 #
记录测试模式、修改侧、两侧观察、路径、属性、顺序,以及对应 Output 消息。结论应具体:“这一步,在这一侧观察到了这个值。”另列未检查的问题,例如其他客户端、网络、重新进入或真实游戏逻辑。
修正后,用相同初始条件重复同一场景。如果问题是其他玩家能看到什么,应另做 Server & Clients 测试;切换按钮不能代替多人检查。本文提供原创方法和教学示意图,不声称实际 Studio 结果、游戏修改或复制测量。
| 记录 | 保存内容 |
|---|---|
| 启动 | 模式和初始条件 |
| 修改 | 侧别、路径与一个属性 |
| 观察 | 两侧与 Output 消息 |
| 结论边界 | 尚未检查的问题 |
原始资料
Roblox Creator Hub — Studio testing modesRoblox Creator Hub — Client-server runtime
Roblox Creator Hub — Script types and locations