Files
ChildHood/docs/design/systems/interaction-system.md
T
starmen1265 887b6e4485 docs(design): 添加游戏愿景、系统设计与v0.1范围文档
新增: 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 命令模板
2026-06-01 00:54:58 +08:00

7.5 KiB
Raw Blame History

环境交互系统 — 设计文档

对应程序实现:交互组件基类、交互检测、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 为静态站位)
  • 交互对象的动画变化(如开门后门保持打开)
  • 时间相关的交互变化