Studio / ROBLOX
按钮没有回应:Roblox 中清楚说明拒绝的故事
虚构工作台故事:错误零件、明确消息、查询状态和安全的下一次操作。区分等待、拒绝、接受、完成与显示失败,不把未知结果写成失败。
虚构工作台与装不上的箭头 #
这是一篇虚构教学故事,不是评价、开发者传记,也不是我们游戏已修复的报告。玛拉设想一个小型 Roblox 原型:工作台上有路标,旁边放短箭头和长木板。玩家需要选择短箭头,装入空槽。按钮写着“安装箭头”。
利奥拿起长木板并点击。按钮稍微变暗,路标没有变化。他等待、再次点击,又转动摄像机。他不知道零件是否错误、角色是否太远,还是请求仍在处理中。故事设定中,错误零件导致操作被拒绝,但屏幕没有说明。本篇从拒绝后的沉默开始,不讨论迷路或没有注意到奖励。先把问题范围写清,才能判断后面的消息到底解决什么。
1. 沉默让玩家猜原因 #
玛拉先提出把按钮高亮得更明显。在想象的场景里,利奥回答:“我看得到该点哪里,不知道发生了什么。”高亮只表明界面对输入有反应,不表示操作的决定。没有解释的红框仍让人猜测多种原因。
纸上出现三个薄弱版本:“错误”“不允许”“再试一次”。第一句没有说明问题,第二句没有说明条件,第三句可能让玩家重复同一个无效动作。它们不一定是假话,却不能帮助继续。玛拉保留按钮,改变提问:要说明哪个已确认状态、能解释什么原因,以及利奥实际可以采取哪一步?短消息并不要求隐藏关键事实,友好的语气也不能代替具体信息。
2. 先写站点规则,再写漂亮句子 #
练习路标有三个自行选择的条件:角色靠近、选中短箭头、槽位空着。这些是虚构原型的规则,不是 Roblox 的通用要求。操作改变游戏世界时,服务器检查相关条件。本地显示按钮或隐藏提示本身不会给予权限。
玛拉把文字和决定分开。消息解释已知检查结果,不能替代检查。错误零件的新消息是:“需要短箭头。到左侧托盘选择它,再点击安装箭头。”物品和下一步都明确了。如果移动托盘,文字也要修改。指向错误位置的漂亮解释会制造另一个谜题。写下一步时必须确认它在场景里确实可执行,而不是给出看似简单却找不到的入口。
3. 给等待一个自己的名称 #
第二版在发送操作后显示“请求已发送,等待结果”。这是等待,既不是拒绝,也不是箭头已经装好。面板保留明确的退出办法。玛拉不会提前画绿色勾号,否则玩家之后要理解为何“成功”又消失。
结果未知时,再次点击不应无限创建相同操作。禁用按钮有助于界面,服务器对重复操作的处理仍需独立设计。长时间等待改为“结果尚不明确,请查询状态”。只有存在查询路径,这才有用。虚构团队先描述这条路径。本文没有提供可运行的状态请求、脚本或通用等待时长。动画持续转动并不能证明服务器仍在执行,更不能把没有消息直接判为失败。
4. 已接受并不等于已完成 #
下一张卡片写“请求已接受,正在安装箭头”。只有实现确实区分接受与完成时才使用。确认收到消息不能仅靠改名字变成操作完成。如果动作立即结束,没有这个阶段,就不需要编造额外卡片。
在我们的设计中,已接受操作还等待最终结果。许可不是改变后的路标。按钮不会承诺零件已在槽里,也不会邀请重新执行已接受的操作。玛拉让状态简单,却不为了短动画把它们混在一起。利奥可以解释:“系统已开始处理,但我还没收到完成确认。”这是虚构人物的台词,不是用户测试发现。实际项目需要依据自己的处理过程选择状态,而不是必须照抄故事中的每个阶段。
5. 有用的拒绝给出可行下一步 #
零件错误时显示短箭头消息。距离太远时:“靠近路标,再尝试安装箭头。”站点占用时:“这个路标正在执行操作,请等待结果并查询状态。”每个原因都与这段场景的具体条件对应。
“你全做错了”既不是状态描述,也不是操作说明。每个错误也不需要长篇技术解释。清楚事实和行动通常足够。如果拒绝确认没有任何变化,可以明确说“箭头未安装”。没有这项确认,句子就过于肯定。对照表收集的是建议替换,应与真实实现核对,不能套到所有回答上。一个温和句子也可能传达错误结果,因此先保证事实,再改善语气。
| 薄弱文字 / 状态 | 建议消息 | 已知状态与下一步 |
|---|---|---|
| 错误 / 零件错误 | 需要短箭头。到左侧托盘选择,再安装。 | 已确认拒绝;修正选择,发送新动作 |
| 不允许 / 太远 | 靠近路标,再尝试安装箭头。 | 当前距离导致拒绝;改变位置 |
| 再试 / 另一个操作 | 路标正在执行操作,请等待结果并查询状态。 | 不保证可再安装;先澄清状态 |
| 槽位已占 | 槽位已占,请查看路标,无需重复安装。 | 已知槽位占用,不证明你的请求成功 |
| 完成 / 只有接受 | 请求已接受,正在安装箭头。 | 确认接受,尚未确认完成 |
| 失败 / 结果未知 | 结果尚不明确,请查询状态。 | 未知不是拒绝;必须有查询路径 |
| 错误 / 变化后的面板问题 | 无法更新面板,重试前请查看路标状态。 | 显示失败与操作状态分开 |
6. 未知结果与拒绝不同 #
玛拉画出一个棘手情况:请求已发送,箭头可能装好了,但回答没出现在面板。单凭沉默不能写“操作失败”。“重新安装”可能造成多余重复。在查清之前,未知必须保持未知。
建议路径是检查同一个路标,把状态与具体动作联系起来。消息契约可以包含操作标识、已知状态和允许的下一步。世界状态本身不能证明你的这次请求结果,应单独检查对应关系。这是设计草图,不是可靠送达保证,也不是现成去重保护。允许重试时,服务器重新检查当前条件,并考虑已处理的动作。漂亮加载图标不能让无限自动重试变得安全。读者要知道查询状态与发起新操作的区别;一个是澄清事实,另一个可能再次改变世界。
7. 显示失败不会自动拆掉箭头 #
现在虚构箭头已在槽里,但更新文本面板发生错误。玛拉以前会把全部叫“故障”。讨论后,她分开操作结果和显示状态:“无法更新面板,请在重试前检查路标状态。”这并不证明安装失败。
Luau 的受保护调用 pcall 可以捕获函数错误并返回失败状态,但不会自行撤销先前的世界变化。因此异常处理不能替代操作契约。技术细节帮助开发者诊断,玩家需要安全的继续路径。本文没有 pcall 代码、真实项目日志,也不声称这句话已接到运行中的站点。两种状态需要分别观察;显示重建与重新执行游戏操作也应被设计成不同动作。
8. 消息需要位置、形式与可访问性 #
玛拉在交互旁保留稳定区域,状态不立即被下一次高亮盖掉。她选择可读的 TextLabel 和清楚的 TextButton。Roblox 提供这些界面元素,但拒绝含义和下一步的选择仍是原型作者的工作。
不能只靠颜色:色彩强调旁边有“等待”或“未安装”等词语,还有原因说明。声音可以辅助,但静音不能隐藏结果。检查对比度、文字尺寸和玩家更大文字偏好。长原因先从含义上精简,不要变成小字。在小屏上应同时读到解释并找到可用行动,而不是只看见装饰。要真正检查末句和按钮,不要从大屏草图推断每个人都能理解。
9. 翻译保留行动,不保留长度 #
虚构团队支持六种语言。英文“Short arrow required”与德文“Ein kurzer Pfeil wird benötigt”长度不同。翻译必须保留短箭头作为具体零件,不能无意变成任何路标。利奥阅读本地化说明,内部状态仍使用独立项目标识。
Roblox 支持本地化工具和手动翻译,可协助准备文字,但不能免除情境与布局检查。中文检查换行和可读性,阿拉伯语检查方向及混合标识。每种语言都要保留完整原因和下一步。不要把“查询状态”翻译成“再执行一次”,两者是不同操作。自动翻译不能证明玩家理解拒绝逻辑。消息与按钮必须指向同一动作,而且标点或截断不能让关键条件消失。
10. 从负面情境开始检查 #
最后一张纸不只写安装成功。要检查错误零件、角色太远、站点占用、等待而结果缺失、回答前再次按,以及确认变化后的显示错误。每种情境先写预期消息、已知状态和允许下一步。计划表结果栏保持空白。
另一位玩家可能在显示按钮和发送请求之间占据空槽。旧界面不能覆盖当前检查。再考虑迟到回答:它不应替换另一个更新动作的反馈。这些是未来实现要求,不是已执行测试。记录把动作与回答联系起来,开发者才能少猜测。几个明确冲突比“测试错误”这个大条目更有用。场景版本和观察也应保存,以便后来复查同一个问题。
| 场景 | 预期契约 | 版本 / 观察 |
|---|---|---|
| 拿长木板而非箭头 | 拒绝:所需物品、已知未变化结果、新选择 | — |
| 角色太远 | 距离原因与可执行下一步 | — |
| 另一玩家占槽 | 当前占用,不证明我们的请求成功 | — |
| 回答前点击,之后迟到回答 | 对应请求与回答,不覆盖另一个更新动作 | — |
| 缺回答,结果未知 | 查询状态,不无限重试或虚假拒绝 | — |
| 操作确认,面板更新失败 | 操作状态与显示失败分开 | — |
| 每种语言、大字、静音 | 原因和行动可读,不只靠颜色或声音 | — |
11. 利奥换零件,理解下一次为何可行 #
虚构结尾里,利奥读完拒绝,选择短箭头,检查槽位空着,发送新的允许操作。面板先显示等待,随后确认:“箭头已安装,请查看路标。”这是修正条件后的新一步,不是一串相同点击的自动队列。玛拉合上消息契约纸。
故事已经结束,实现还在读者前面。资料与文章结构经过检查,但原型没有在 Studio 运行,也没有收集指标。操作成功不代表下次访问会保存结果,这种行为未在此设计。交给其他开发者规则、状态、句子与未填计划。有用的拒绝让人清楚知道如何继续,也会在结果尚未知时保持诚实。不要把故事的圆满收尾当作任何真实游戏已修好的证据。
原始资料
Roblox Creator Hub — Accessibility guidelinesText & image labels
Text & image buttons
Localization
Securing the client-server boundary
Luau standard library — pcall
TextLabel