# 00 · 全局交互规范(Global UX) > **给开发者的实现要点摘要** > 1. **交互权威**是 [26-audio-interaction-playbook.md](26-audio-interaction-playbook.md)。本文是它在本项目的施工口径。两份冲突时以 26 号为准。`research/02-methodology` 与旧豁免表一律让路。 > 2. 设置项(voice / speed / bgm / guide / input)只在大厅页改,存 `localStorage["soundgame.settings"]`,游戏内只读。 > 3. **每次操作必须有声音回执**(ok / invalid / busy,§2)。震动是补充,不是主通道。电脑和 iPhone 没有震动时,回执声仍要响。 > 4. 旁白整句预生成,禁止数字/碎片拼接。指令句 ≤12 字;叙事句 ≤25 字。 > 5. **新手期只开放三个手势**:单击、左右滑、上滑。双击默认不存在。四向滑动是核心玩法时,帮助统一换到长按(全项目同一条,不许各游戏各换)。 > 6. 用户系统:大厅登录,进度走 REST API,本地 localStorage 离线缓存。 --- ## 0. 文档地位与废止清单 本文取代自己 R1~R7 的手势宪法、向导接线、以及「操作反馈一律只靠震动」的旧裁定。下列旧规则**废止**: | 废止 | 改为 | |---|---| | 双击 = 重听(全局默认) | 新手期不识别双击;阶段 3 以后才解锁,且不得绑重播整段、重开 | | 单击等 300ms 双击窗 | 新手期 `doubleTapWindow: 0`,松手即单击 | | 无效操作只震不说 | 声音回执 `invalid` + 每个「状态×手势」解释一次 | | iOS 无震动则无反馈 | 回执声永远出声;震动可有可无 | | 各游戏豁免表各换帮助入口 | 四向滑动是玩法 → 帮助一律长按 | | 菜单:单击循环、双击确认 | 菜单:左右滑切换、单击确认(与探索同构) | | 看门狗原样重播说明书 | 三档提示:完整句 → 短句 → 提示音 | | 向导语音 `queue:true` 永不打断 | 玩家一动游戏就停(关键句除外,≤3s) | | 句间恢复 BGM duck | 整条语音链期间保持压低 | 仍有效、未改:设置系统、旁白整句管线、用户进度 API、键盘平行通道的键位表(语义随新手模式变)。 --- ## 1. 设置系统(已实现:engine/settings.js + 大厅设置面板) ### 1.1 设置项语义 | 设置项 | 取值 | 精确语义 | |---|---|---| | `voice` | `"female"`(默认)/ `"male"` | 切换 voice 资产目录。`play('voice/xxx')` 解析为 `audio/voice//xxx.{ogg,m4a,mp3,wav}`,找不到回退平铺 `audio/voice/xxx.*`。两性别 id 集合必须一致。角色/NPC 音走平铺,不切性别。 | | `speed` | `1.0` / `1.35` / `1.7` / `2.2` | 只作用于 voice 层 playbackRate,从下一句生效。TTS 按 1.0 生成。`2.2` 为视障档。 | | `bgm` | `1.0` / `0.3` / `0` | BGM 层增益。`0` = 不加载不播放任何 `bgm/`。内容环境音在 sfx 层,不受此项误杀。 | | `guide` | `"full"`(默认)/ `"standard"` / `"off"` | 向导等级:`full`=等待声+三档提示语音+回执;`standard`=等待声+回执+提示音,无向导语音;`off`=回执仍在,不挂迷茫/看门狗定时器。 | | `input` | `"auto"` / `"touch"` / `"key"` | 只影响提示文案,不关闭任何输入通道。三通道永远并行。 | 存储 key = `soundgame.settings`。非法键/值逐项丢弃。`speed`/`bgm` 存数值。 ### 1.2 修改入口 只在大厅。游戏内菜单可播报当前值,并说「请回到大厅修改」。大厅变更后应播一句样例(voice+speed),未做则补,非阻塞。 ### 1.3 服务器同步 设置作为特殊游戏键 `_settings` 走进度接口。登录后服务器覆盖本地。离线纯 localStorage。 --- ## 2. 输入回执与震动 ### 2.1 回执是主通道(26 号原则 4) 三种合成系统音,全项目统一,接引擎 master,不走 sfx 内容资产: | 回执 | 何时 | 听感(起步参数) | |---|---|---| | `ok` | 操作被接受并生效 | 三角波 1600Hz,35ms,增益 0.08,「嗒」 | | `invalid` | 收到了,但现在用不上 | 正弦 260→200Hz,120ms,增益 0.10,低沉「咚」 | | `busy` | 游戏在说关键句或正在处理 | 正弦 520Hz,40ms,增益 0.04,很轻「嗯」 | 规则: - 100ms 内出声;回执 ≤0.2s。 - 游戏已为这次操作播了明显内容音(脚步、开门),可省 `ok`(记 `silent-ok`)。`invalid` 与 `busy` 永远播。 - 系统音一律合成;内容音一律录音。两类永不混用。 - 单击执行「继续/跳过」后 **400ms 内**再来的单击只给 `busy`,不连跳、不误进下一段。 ### 2.2 震动是补充(已实现:engine/haptics.js) 十种震型名不变:`confirm/error/success/warning/swipe/heartbeat/pickup/hit/beat/danger`。语义仍按语义选用,不按游戏选用。 - gesture.js 内置:滑动→`swipe`,tap/doubletap→`confirm`。游戏层不要对「手势被识别」再震一次。 - 单次 ≤500ms;danger 循环间隔 ≥400ms;200ms 窗口去抖。 - 长对白、纯聆听记音阶段不震(节拍锚点 `beat` 除外)。 - iOS 无震动:no-op。**不再把「绝不回退提示音」理解成「无任何声音反馈」**——回执声仍然要响。旧教学口径「iPhone 用户听结果声」改为「听回执声和结果声」。 --- ## 3. 旁白质量与台词写作 整句生成、分段数字、同游戏同 speaker+instruct、管线 `tools/gen_voice_dual.py`、双格式 ogg+m4a:沿用原规范。 **26 号增补(写作强制)**: | 用途 | 规则 | 例子 | |---|---|---| | 指令 | 「动作 + 结果」,≤12 字 | 「向左滑,开门。」 | | 短句档 | ≤6 字,只留动作 | 「向左滑。」 | | 叙事 | 单句 ≤25 字 | | | 我在哪 | 位置。目标。一个动作。≤20 字 | 「厨房。找钥匙。左右滑。」 | | 归因 | 原因 + 下次怎么做;必须真实 | 「慢了。听到就滑。」 | | 肯定 | ≤4 字 | 「对。」 | | 解释无效 | 现在怎样。能做什么。每个状态×手势一次 | 「还在讲故事。点一下可以跳过。」 | 每句台词标类别:`critical` / `content` / `hint` / `feedback`(26 §4.6)。`critical` ≤3s。`hint`/`feedback` 空闲才播,过期丢弃。 禁止:「如果」「可以尝试」;一句里教两个手势;游戏主动原样重复。 --- ## 4. 用户系统(已实现) 形态、API、`summary` 必填、`_settings` 保留键:不变。 **26 号增补**:退出自动存;重进 5 秒内播一句局面复述(位置 + 目标 + 现在做什么),然后交出话轮。复述句 id 随等待点写入进度。 --- ## 5. 手势宪法(26 号原则 6) ### 5.1 新手期三手势(全部游戏共用) | 手势 | 唯一含义 | 游戏在说时 | 等你操作时 | |---|---|---|---| | 单击 | 继续 / 确定 / 听一下 | 只跳过当前这句(`skipVoice`),给 `ok` | 执行继续或确定 | | 左滑 / 右滑 | 选择 / 移动 | 打断并执行 | 执行 | | 上滑 | 我在哪、我该干嘛(一句) | 打断后回答 | 回答 | | 手势 | 新手期 | |---|---| | 双击 | **不存在**。`doubleTapWindow: 0`。键盘回车按单击处理 | | 下滑 | 未解锁:`invalid` + 首次解释 | | 长按 | 未占用帮助时:旁白加速(12 号)。四向滑动是玩法时:长按=帮助,关闭加速 | 滑动、上滑:打断并执行。单击:只打断(跳句),不顺带执行「继续下一段」。 ### 5.2 解锁阶梯(跨局记住,存进度或 `_settings`) | 阶段 | 条件 | 解锁 | |---|---|---| | 0 | 首次进入 | 单击、左右滑 | | 1 | 第一个小目标 | 上滑(或长按帮助,若滑动是玩法) | | 2 | 第一局结束 | 下滑=菜单 | | 3 | 累计 3 局 | 双击=重听**当前等待点完整句**(加「再说一遍:」)。禁止绑整段重播、重开、连跳 | | 4 | 大厅一键或专属教学 | 游戏专属高级手势 | 大厅提供「全部解锁」给老玩家。 ### 5.3 四向滑动是玩法:帮助换长按 适用:escape、space、rhythm/drummer、dungeon、hunt,以及任何四向滑=移动/闪避/演奏的游戏。 - 帮助 = 长按。所有这类游戏同一条,不许再各换双击/上滑。 - 菜单仍到阶段 2 才开放下滑;对局中下滑若与玩法冲突,对局中不开菜单,结算后开。 - 新手期双击仍按单击处理。 **六手势都是音色/答题(simon)**:帮助也换长按;音色按实力渐进开放,一次只学一样。 ### 5.4 模态菜单(阶段 2 以后) **下滑呼出 → 左右滑切换(每项报名)→ 单击确认 → 上滑或长按=重听菜单说明 →「返回游戏」或再下滑关闭。** 废止「单击循环 + 双击确认」。原因:新手期没有双击;单击的全局含义是确定,菜单里不应改成切换。 标准选项:重新开始(破坏性,二次确认)/ 保存并回大厅 / 返回游戏。打开时暂停计时玩法。 RPG 探索菜单与探索同构:左右滑 + 单击,符合本条。战斗态下滑=逃跑,不设菜单。 选曲等非模态选项界面:左右滑 + 单击,不变。 结算:单击=再来一局;菜单已解锁则下滑=菜单。 ### 5.5 通则 - 矩阵无空格:每个「可感知状态 × 已解锁手势」都必须有声音(回执或内容音)。见各游戏设计单。 - 连点/乱滑不绑定破坏性操作。 - 引导可跳过:已完成过引导的玩家,开场用一句问「点一下开始」;重听引导放到帮助手势,不占用下滑(新手期下滑未解锁)。 - `immediateTap` 仅 rhythm/drummer 演奏期。新手期其他游戏用 `doubleTapWindow: 0` 获得即时单击,不要开 immediateTap。 - 教学:第一句话就动手;一次只教一个;做对立刻肯定(≤4 字)并进入下一步,禁止成功后再灌补救。 ### 5.6 键盘平行通道 键位表不变(方向键/WASD=滑,空格=单击,回车=双击,按住空格=长按)。 新手期差异: - `doubleTapWindow: 0` 时触屏与空格均立即单击。 - 回车仍发 `doubletap`:游戏层在新手期把它当成 `tap`。 - 提示文案随 `settings.input`:触屏说「点一下」,键盘说「按空格」。 守卫、遮罩解锁、测试约定沿用原实现。 --- ## 6. 发言权、等待声、向导 实现骨架见 26 号 §4.1~§4.6;接线裁定见 [14-guide-layer.md](14-guide-layer.md)。 | Floor 状态 | 听感 | 玩家操作 | |---|---|---| | `SPEAKING` | 语音;BGM 整链压低;句间不起等待声 | 可打断句:立刻停,按 §5.1 处理;关键句:`busy` | | `YOUR_TURN` | 交接提示音 `turn` → 400ms 后等待声,直到操作 | 等待声 80ms 淡出,交给游戏 | | `BUSY` | 只有内容演出,无等待声 | `busy` | | `ACTION` | 玩法声本身就是状态(节奏、闪避、探索环境音常驻) | 直接交给游戏 | 等待声:合成、轻、全项目一套(26 §4.1 起步参数)。剧情类可用很轻的环境循环替代,但必须全游戏统一。 迷茫:从乱点/连无效/反复重听识别,三级接管(短提示 → 只留一个手势 → 自动演示)。静默看门狗只负责「不动」:动作类 5~8s,剧情类 15~20s,最多两级后安静,只留等待声。 状态签名 earcon(menu/explore/battle/choice/settle/danger + turn/nudge)保留。新手期只教玩家能感知的 ≤3 种,第一次出现配一句解释。 --- ## 7. 横切验收(每款游戏开工前) 设计单必须交齐 26 号附录 C:一句话核心动作、≤3 个可感知状态、新手手势与解锁、状态×手势矩阵、等待点、首 3 分钟逐秒脚本、失败表、台词类别、断点复述句。 合格指标见 26 §6.4。出现 26 §7 任一反模式,设计不通过。