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

238 lines
7.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 环境交互系统 — 设计文档
> 对应程序实现:交互组件基类、交互检测、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 关闭文本
- 文本显示期间角色可以缓慢移动(不硬锁定)
---
## 交互对象数据结构
每个可交互物体需要以下信息:
```json
{
"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 为静态站位)
- 交互对象的动画变化(如开门后门保持打开)
- 时间相关的交互变化