Files
SoundGame/docs/design/00-global-ux.md
T
2026-10-01 23:26:47 +08:00

12 KiB
Raw Blame History

00 · 全局交互规范(Global UX)

给开发者的实现要点摘要

  1. 交互权威是 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/<gender>/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。

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 任一反模式,设计不通过。