Files
ChildHood/docs/design/systems/interaction-system.md
T
2026-06-01 18:25:27 +08:00

11 KiB
Raw Blame History

环境交互系统 — 设计文档

对应程序实现:交互组件基类、交互检测、UI 提示系统


设计目标

让玩家通过"触碰"来感知这个世界——每一个可交互的物体都是一段记忆的入口。交互系统是 v0.1 的核心体验,它决定了玩家能否真正"活"在这个场景中。


交互类型

1. 观察(Examine) — 最核心的交互

用途: 查看物品或场景,触发主角的内心独白

触发流程: 走进触发范围(1.5m)→ 物体上方浮现提示 [E] 查看旧冰箱 → 按 E 触发

触发后表现:

  1. 相机从当前第三人称位置平滑推向物体前方约 0.8-1m,高度略低于物体中心(微仰视),推镜约 0.5 秒,ease-out 缓动
  2. 角色自动转向物体(不锁定移动,可微调位置但不能跑开)
  3. 相机到位后 0.2 秒,屏幕底部浮现内心独白文案(打字机效果,每字约 0.05 秒)
  4. 按 E 或 ESC 关闭:文案淡出,相机 0.3 秒回到默认第三人称位置

文案风格示例:

[旧冰箱]
夏天的时候最期待打开冰箱的那一刻。
冰棒、西瓜、偶尔还有一瓶健力宝。
现在想起来,那个冰箱的嗡嗡声好像还在耳边。

[墙上的涂鸦]
不知道是谁画的,但画得还挺像奥特曼的。
我以前也想在墙上画,被我妈追着打了半条街。

[地上的弹珠]
一颗彩色花纹的弹珠,大概是哪个小孩掉的。
我以前也丢过最喜欢的那颗,找了整个下午都没找到。

设计原则:

  • 每个观察文本都是一个独立的"微叙事"
  • 文字简短(2-4句),不冗长
  • 带有情感但不矫情
  • 用孩子的视角看世界,不是大人回望

2. 拾取(Pick Up)

用途: 收集场景中散落的小物品

触发流程: 走近拾取品(1.5m)→ 物品上方浮现提示 [E] 拾取 弹珠 → 按 E 触发

触发后表现:

  1. 相机不动,保持第三人称视角
  2. 角色播放弯腰拾取动画(约 1 秒)
  3. 动画播放至"手碰到物品"时间点,物品从场景消失
  4. 右上角弹出物品获得提示(图标 + 名称),1.5 秒后自动淡出
  5. 收集计数 +1,自动结束(无需手动关闭)

v0.1 可拾取物品:

  • 弹珠(不同花色)
  • 小石子
  • 橡皮擦
  • 糖纸
  • 水浒卡碎片

3. 操作(Operate)

用途: 与场景设施或大型物体交互

触发流程: 走近操作对象(1.5m)→ 对象上方浮现提示 [E] 打开门 → 按 E 触发

触发后表现(通用模式):

  1. 相机推向操作对象(同观察类型的推镜方式)
  2. 角色播放对应操作动画
  3. 操作完成后触发状态变化
  4. 相机回到默认位置

v0.1 操作对象及具体表现:

操作对象 推镜 角色动画 结果
门(家/小卖部) 不推镜 角色伸手推门 门状态切换(开↔关),开门后可走进去
废纸箱(翻找) 推近纸箱 角色弯腰翻找 弹出翻找结果文本,或意外发现拾取品

v0.1 操作交互对象:

  • 家的门(进出)
  • 小卖部门(进出)
  • 公用电话亭(观察 + 对话文本)
  • 水塘边的石头(可以打水漂?v0.2)

4. 对话(Talk) — v0.1 简化版

用途: 与场景中的 NPC 交谈

触发流程: 走近 NPC(1.5m)→ NPC 上方浮现提示 [E] 和老板说话 → 按 E 触发

v0.1 简化方案:

  • v0.1 不实现完整对话系统
  • NPC 本质上是"会说话的观察对象",交互表现与观察类型一致
  • 触发后:相机推向 NPC → 底部浮现场景描述文本(非内心独白)
  • 例如:走近小卖部老板 → 相机推向老板 → "老板正在柜台后面打瞌睡,电视里放着还珠格格。"
  • 按 E/ESC 关闭,相机回位
  • 后续版本再加入对话树和分支

交互提示 UI

可交互性提示(两级机制)

远距离(3-4m 外):无 UI 提示,靠场景设计引导注意力

  • 可交互物体的摆放位置有"意图感",不会靠墙角挤成一堆,放在玩家容易注意到的位置
  • 拾取品有微弱的地面光斑/小光点,暗示"这里有东西"(融入夏日阳光氛围,不违和)

近距离(1.5m 内,触发范围):物体上方浮现交互提示 UI

  • 多个物体在范围内时,只显示最近的那个
  • 角色离开触发半径时提示消失

提示样式

提示样式

┌─────────────────────────┐
│  [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 交互对象清单

程序 Agent 按分阶段顺序实现。第一轮跑通系统,第二轮填充体验。

第一轮:系统验证(5 个,优先实现)

覆盖全部 4 种交互类型,跨 3 个区域,验证核心流程。

# ID 名称 类型 区域 验证目标
1 fridge_home 旧冰箱 观察 家 室内大件观察,相机推镜 + 内心独白文案
2 door_home 家的门 操作 家 最简操作交互,门开↔关状态切换
3 ground_marble 散落的弹珠 拾取 空地 拾取完整流程:提示→弯腰→消失→计数+1
4 phone_booth 公用电话亭 观察 街道 室外独立物体观察,户外推镜体验
5 owner_shop 老板 NPC 小卖部 走向人→推镜→场景描述文本

探索路线: 家(冰箱→门)→ 街道(电话亭)→ 小卖部(老板)→ 空地(弹珠)

第二轮:体验填充(5 个,系统跑通后追加)

验证多交互物并存、不同物体形态的推镜差异。

# ID 名称 类型 区域 补什么体验
6 tv_home 老式电视 观察 家 同区域第二件观察物,验证不冲突
7 shelf_snack 零食货架 观察 小卖部 矮物体推镜角度,近距离观察
8 ground_card 水浒卡碎片 拾取 空地 第二个拾取品,验证不互相干扰
9 wall_graffiti 墙上的涂鸦 观察 街道 墙面类物体,水平推镜方向
10 box_alley 废纸箱 操作(翻找) 巷子 第二种操作类型,与门不同

后续版本(v0.1 可选,不阻塞验收)

以下交互物在第一轮 + 第二轮全部完成后,视开发进度按区域补充:

区域 ID 名称 类型
家 bed_home 我的床 观察
家 desk_home 书桌 观察
家 calendar_home 日历 观察
小卖部 shelf_drink 冰柜 观察
小卖部 card_rack 卡片架 观察
街道 bike_street 老式自行车 观察
街道 laundry 晾衣杆 观察
街道 manhole 下水道盖 观察
空地 ground_stone 小石子 拾取
空地 tree_empty 大树 观察
空地 puddle 水坑 观察
巷子 cat_alley 流浪猫 观察
巷子 window_alley 老窗户 观察
巷子 spider_alley 蜘蛛网 观察
水塘边 pond_edge 水塘 观察
水塘边 frog_pond 青蛙 观察
水塘边 reed_pond 芦苇 观察
水塘边 ground_wrapper 糖纸 拾取
水塘边 ground_eraser 橡皮擦 拾取

白盒方案

v0.1 使用近似占位模型而非纯不可见触发区域,以便调试相机推镜距离、空间关系和交互体验。

原则:

  • 找免费 lowpoly 模型或 UE Marketplace 免费素材,形状和比例大致对即可
  • 冰箱用方箱子、自行车用简单两轮模型,不要求贴图精确
  • 后续美术阶段替换为正式资产

交互物占位模型需求(按实现阶段排列):

第一轮(必须):

ID 交互物 占位模型建议
fridge_home 旧冰箱 白色方箱子(~1.7m 高)
door_home 家的门 扁平方片,可绕轴旋转
ground_marble 散落的弹珠 小球体,+ 地面光斑
phone_booth 公用电话亭 窄高方柱(~2m 高)
owner_shop 老板(NPC) 简单人形胶囊体,坐姿

第二轮(追加):

ID 交互物 占位模型建议
tv_home 老式电视 方箱 + 凸起背部(~0.5m 高)
shelf_snack 零食货架 多层架结构(~1.8m 高)
ground_card 水浒卡碎片 小方片,+ 地面光斑
wall_graffiti 墙上的涂鸦 墙面贴花/色块
box_alley 废纸箱 开口方箱(~0.5m 高)

v0.1 不包含

  • 对话树 / 对话分支系统
  • 物品背包 UI(物品拾取后只计入收集计数)
  • 物品使用/组合系统
  • NPC AI(NPC 为静态站位)
  • 交互对象的动画变化(如开门后门保持打开)
  • 时间相关的交互变化