887b6e4485
新增: game-vision.md, v01-scope.md, brainstorm 记录, player-controller/interaction-system/collection-system 设计, scene-v01-suburban 场景设计 更新: CLAUDE.md 协作规范, style-guide 时代设定, current.md/roadmap.md 进度追踪, design 命令模板
7.5 KiB
7.5 KiB
环境交互系统 — 设计文档
对应程序实现:交互组件基类、交互检测、UI 提示系统
设计目标
让玩家通过"触碰"来感知这个世界——每一个可交互的物体都是一段记忆的入口。交互系统是 v0.1 的核心体验,它决定了玩家能否真正"活"在这个场景中。
交互类型
1. 观察(Examine) — 最核心的交互
用途: 查看物品或场景,触发主角的内心独白
表现:
- 角色走近物品,按交互键
- 屏幕底部或侧面浮现一段文字(主角的内心独白)
- 文字打字机效果逐字出现,按任意键加速/跳过
- 不进入独立界面,在场景中原地显示
文案风格示例:
[旧冰箱]
夏天的时候最期待打开冰箱的那一刻。
冰棒、西瓜、偶尔还有一瓶健力宝。
现在想起来,那个冰箱的嗡嗡声好像还在耳边。
[墙上的涂鸦]
不知道是谁画的,但画得还挺像奥特曼的。
我以前也想在墙上画,被我妈追着打了半条街。
[地上的弹珠]
一颗彩色花纹的弹珠,大概是哪个小孩掉的。
我以前也丢过最喜欢的那颗,找了整个下午都没找到。
设计原则:
- 每个观察文本都是一个独立的"微叙事"
- 文字简短(2-4句),不冗长
- 带有情感但不矫情
- 用孩子的视角看世界,不是大人回望
2. 拾取(Pick Up)
用途: 收集场景中散落的小物品
表现:
- 靠近地面上的可拾取物品(发光或微光提示)
- 按交互键,角色弯腰拾取动画
- 屏幕右上角弹出物品获得提示(图标 + 名称,1.5秒后消失)
- 物品自动进入背包/收集列表
v0.1 可拾取物品:
- 弹珠(不同花色)
- 小石子
- 橡皮擦
- 糖纸
- 水浒卡碎片
3. 操作(Operate)
用途: 与场景设施或大型物体交互
操作类型:
| 操作 | 表现 | 示例 |
|---|---|---|
| 开门/关门 | 角色推门动画,门物理旋转 | 家的门、小卖部的门 |
| 翻找 | 角色弯腰/伸手动画 | 翻抽屉、翻纸箱 |
| 使用设施 | 角色走到设施前触发 | 按公用电话、开水龙头 |
v0.1 操作交互对象:
- 家的门(进出)
- 小卖部门(进出)
- 公用电话亭(观察 + 对话文本)
- 水塘边的石头(可以打水漂?v0.2)
4. 对话(Talk) — v0.1 简化版
用途: 与场景中的 NPC 交谈
v0.1 简化方案:
- v0.1 不实现完整对话系统
- NPC 以"观察"方式交互——走近 NPC 显示一段对话/描述
- 例如:走近小卖部老板 → 显示"老板正在柜台后面打瞌睡,电视里放着还珠格格。"
- 后续版本再加入对话树和分支
交互提示 UI
触发规则
- 角色进入可交互物体的触发半径(默认1.5m)时显示提示
- 角色离开触发半径时提示消失
- 多个物体在范围内时,只显示最近的那个
提示样式
┌─────────────────────────┐
│ [E] 查看旧冰箱 │
└─────────────────────────┘
- 位置:物体上方偏移(屏幕空间投影)
- 字体:简洁的中文字体,白色带轻微描边
- 图标:交互键(E)+ 动作词(查看/拾取/打开)
- 过渡:淡入淡出(0.2秒)
交互类型图标
| 类型 | 图标文字 | 颜色 |
|---|---|---|
| 观察 | 🔍 查看 | 白色 |
| 拾取 | ✋ 拾取 | 黄色 |
| 操作 | 🖐 打开 | 白色 |
交互后的叙事文本 UI
显示位置
- 屏幕下方居中,半透明背景条
- 不遮挡主视角
样式
╭──────────────────────────────────────────╮
│ │
│ 夏天的时候最期待打开冰箱的那一刻。 │
│ 冰棒、西瓜、偶尔还有一瓶健力宝。 │
│ │
│ [E] 关闭 │
╰──────────────────────────────────────────╯
- 背景:半透明黑色(透明度约60%)
- 文字:白色,逐字出现(打字机效果,每字约0.05秒)
- 按 E 或 ESC 关闭文本
- 文本显示期间角色可以缓慢移动(不硬锁定)
交互对象数据结构
每个可交互物体需要以下信息:
{
"id": "fridge_home",
"name": "旧冰箱",
"type": "examine",
"triggerRadius": 1.5,
"interactText": "查看旧冰箱",
"narrativeText": [
"夏天的时候最期待打开冰箱的那一刻。",
"冰棒、西瓜、偶尔还有一瓶健力宝。",
"现在想起来,那个冰箱的嗡嗡声好像还在耳边。"
],
"oneShot": false
}
oneShot: true表示只触发一次(如拾取物品、一次性事件)oneShot: false表示可反复交互(如观察类),但文本可以随机变化
v0.1 交互对象清单
按场景区域划分(配合 scene-v01-suburban.md):
家
| ID | 名称 | 类型 | 描述 |
|---|---|---|---|
| fridge_home | 旧冰箱 | 观察 | 夏天的冰箱记忆 |
| tv_home | 老式电视 | 观察 | 大脑袋电视,天线要调 |
| bed_home | 我的床 | 观察 | 床底下的宝藏箱 |
| desk_home | 书桌 | 观察 | 没写完的暑假作业 |
| calendar_home | 日历 | 观察 | 圈着"开学的日期",被划掉了又画上 |
小卖部
| ID | 名称 | 类型 | 描述 |
|---|---|---|---|
| door_shop | 小卖部门 | 操作 | 进出小卖部 |
| shelf_snack | 零食货架 | 观察 | 辣条、泡泡糖、干脆面…… |
| shelf_drink | 冰柜 | 观察 | 健力宝、北冰洋、袋装冰 |
| owner_shop | 老板 | 观察(NPC) | 打瞌睡的老板和电视声 |
| card_rack | 卡片架 | 观察 | 水浒卡、数码宝贝卡片 |
街道
| ID | 名称 | 类型 | 描述 |
|---|---|---|---|
| phone_booth | 公用电话亭 | 观察 | IC卡电话的回忆 |
| bike_street | 老式自行车 | 观察 | 爸爸的永久牌 |
| laundry | 晾衣杆 | 观察 | 满院子飘着的衣服 |
| wall_graffiti | 墙上的涂鸦 | 观察 | 不知谁画的奥特曼 |
| manhole | 下水道盖 | 观察 | 弹珠掉进去的声音 |
空地
| ID | 名称 | 类型 | 描述 |
|---|---|---|---|
| ground_marble | 散落的弹珠 | 拾取 | 彩色花纹弹珠 |
| ground_card | 水浒卡碎片 | 拾取 | 被踩脏的卡片 |
| ground_stone | 小石子 | 拾取 | 打水漂用的石头 |
| tree_empty | 大树 | 观察 | 爬不上去的梧桐树 |
| puddle | 水坑 | 观察 | 昨天下的雨还没干 |
巷子
| ID | 名称 | 类型 | 描述 |
|---|---|---|---|
| cat_alley | 流浪猫 | 观察 | 巷子深处的猫 |
| window_alley | 老窗户 | 观察 | 窗台上的花盆 |
| box_alley | 废纸箱 | 操作(翻找) | 可能藏着好东西 |
| spider_alley | 蜘蛛网 | 观察 | 角落里的蛛网 |
水塘边
| ID | 名称 | 类型 | 描述 |
|---|---|---|---|
| pond_edge | 水塘 | 观察 | 水面倒映着天空 |
| frog_pond | 青蛙 | 观察 | 荷叶上的青蛙 |
| reed_pond | 芦苇 | 观察 | 风吹过的沙沙声 |
| ground_wrapper | 糖纸 | 拾取 | 彩色的糖纸 |
| ground_eraser | 橡皮擦 | 拾取 | 用了一半的橡皮 |
v0.1 不包含
- 对话树 / 对话分支系统
- 物品背包 UI(物品拾取后只计入收集计数)
- 物品使用/组合系统
- NPC AI(NPC 为静态站位)
- 交互对象的动画变化(如开门后门保持打开)
- 时间相关的交互变化