refactor: 拆分D2 Sleep表现并接入快照
This commit is contained in:
@@ -0,0 +1,130 @@
|
||||
# D2 Sleep 表现系统拆分与存档重构方案
|
||||
|
||||
## 目标
|
||||
|
||||
将 D2 Sleep 新增的轱辘、风筝、全屏序列帧、虚焦和门近景控制从通用 `SpriteShowcase` 中剥离,同时为通用图片与 D2 专属表现分别建立可扩展的语义快照。
|
||||
|
||||
本次重构保持 Yarn 命令名、参数默认值、Addressable key、场景视觉参数和剧情文本不变。
|
||||
|
||||
## 职责边界
|
||||
|
||||
### SpriteShowcase
|
||||
|
||||
只保留跨章节可复用的能力:
|
||||
|
||||
- 普通小图显示、隐藏。
|
||||
- 普通大图显示、隐藏。
|
||||
- 背景淡入淡出。
|
||||
- 通用即时清理。
|
||||
- 通用图片终态的捕获与恢复。
|
||||
- 在图片切换、隐藏或清理前触发 `PresentationChanging`,通知场景专属表现清除叠加层。
|
||||
|
||||
`SpriteShowcase` 不再持有 D2 配置、运行时节点、遮罩、序列帧协程、虚焦材质或 D2 Tween。
|
||||
|
||||
### Day2SleepPresentationController
|
||||
|
||||
D2 Sleep 场景级统一入口,负责:
|
||||
|
||||
- 普通小图、轱辘、风筝和大图特效的互斥。
|
||||
- 监听 `SpriteShowcase.PresentationChanging` 并停止全部 D2 表现。
|
||||
- 为 Yarn 和 `DreamDoorSystem` 提供稳定 API。
|
||||
- 捕获、恢复 D2 专属表现的语义终态。
|
||||
|
||||
内部 Presenter:
|
||||
|
||||
| 类型 | 职责 |
|
||||
| --- | --- |
|
||||
| `ReelMotionPresenter` | 轱辘底图/运动层、SpriteMask、`reel_tension` 常驻拉锯循环 |
|
||||
| `KitePresentation` | 风筝相机节点、底图、遮罩、sway/accent 层、资源加载与显隐 |
|
||||
| `KiteRigDriver` | 风筝连续运动、风况、高度、镜头补偿与对焦算法 |
|
||||
| `LargeSpriteEffectsPresenter` | 全屏序列帧、虚焦、大图缩放/透明度及 Tween |
|
||||
|
||||
## Yarn 与系统调用
|
||||
|
||||
D2 专属命令移动到 `Day2SleepYarnCommand`:
|
||||
|
||||
- `show_sprite_motion`
|
||||
- `sprite_motion`
|
||||
- `kite_show`
|
||||
- `kite_state`
|
||||
- `kite_wind`
|
||||
- `kite_accent`
|
||||
- `kite_hide`
|
||||
- `show_large_sprite_animation`
|
||||
- `set_large_sprite_blur`
|
||||
- `tween_large_sprite_blur`
|
||||
- `tween_large_sprite_blur_async`
|
||||
|
||||
普通 `show_sprite`、`show_large_sprite`、`hide_*` 和 Showcase 背景命令仍由 `BaseYarnCommand` 调用 `SpriteShowcase`。
|
||||
|
||||
`DreamDoorSystem` 的大图换图、近景缩放和透明度控制调用 `Day2SleepPresentationController`。Bloom、曝光、海浪和终端逻辑仍属于 `DreamDoorSystem`。
|
||||
|
||||
## 存档模型
|
||||
|
||||
存档只记录可重建的语义终态,不保存 Coroutine、Tween、运行时 GameObject、SpriteMask、材质实例或随机运动瞬时相位。
|
||||
|
||||
### showcase section
|
||||
|
||||
稳定 id:`showcase`,RestoreOrder:69。
|
||||
|
||||
`ShowcaseSnapshotDto`:
|
||||
|
||||
- `displayMode`:`None` / `Small` / `Large`。
|
||||
- `picName`:逻辑图片名,不保存加载后的 `Sprite`。
|
||||
- `isBackgroundVisible`:背景遮罩终态。
|
||||
|
||||
恢复时通过 `ResourceSystem` 重新加载图片,并以 0 秒时长应用终态。
|
||||
|
||||
### day2SleepPresentation section
|
||||
|
||||
稳定 id:`day2SleepPresentation`,RestoreOrder:70。
|
||||
|
||||
`Day2SleepPresentationSnapshotDto` 按模式保存:
|
||||
|
||||
| 模式 | 保存内容 |
|
||||
| --- | --- |
|
||||
| `SmallMotion` | 图片名、motion profile |
|
||||
| `Kite` | 目标高度、风向、乱度 |
|
||||
| `LargeEffects` | 序列帧前缀/帧数/帧间隔、虚焦参数、缩放倍率、透明度 |
|
||||
|
||||
`kite_accent` 属于一次性顿挫,不进入快照;轱辘和风筝的随机相位在恢复后从对应语义状态重新开始。
|
||||
|
||||
若当前没有 D2 专属状态,Provider 返回 `null`,不写入该 section。通用大图叠加了 D2 虚焦或门近景效果时,会同时写入 `showcase` 与 `day2SleepPresentation`:先恢复底图,再恢复特效。
|
||||
|
||||
### 恢复顺序
|
||||
|
||||
相关表现 Provider 顺序为:
|
||||
|
||||
1. `showcase`(69):恢复普通底图和背景。
|
||||
2. `day2SleepPresentation`(70):恢复 D2 动态层或大图特效。
|
||||
3. `playTool`(71):恢复物品展示 UI。
|
||||
4. `screen`(80):恢复饱和度和全屏遮罩。
|
||||
|
||||
旧存档没有新增 section 时直接跳过,不提升 `schemaVersion`。旧 `showcase` JSON 中的额外字段由 Json.NET 忽略。
|
||||
|
||||
## 场景迁移
|
||||
|
||||
`梦境` 场景保留原 `SpriteShowcase` 组件及脚本 GUID,只留下三个 Renderer 引用。新增 `Day2SleepPresentationController`,迁移原对焦材质和三组风筝设置。轱辘、风筝和遮罩节点仍在运行时动态创建。
|
||||
|
||||
## 生命周期清理
|
||||
|
||||
- 普通图片切换前:`PresentationChanging` 清理 D2 表现。
|
||||
- D2 模式切换前:控制器清理普通图片与上一种 D2 表现。
|
||||
- 返回菜单、切章和读档前:`GameManager` 分别清理 D2 控制器与 `SpriteShowcase`。
|
||||
- 组件禁用或销毁:停止 Coroutine/Tween、隐藏运行时节点、关闭 SpriteMask,并恢复大图材质属性、缩放和透明度。
|
||||
|
||||
## 验证范围
|
||||
|
||||
- Unity 编译和现有 EditMode 测试通过。
|
||||
- FP/Fiction Day1 普通小图、大图和背景淡入淡出无回退。
|
||||
- D2 Sleep 轱辘、风筝、全屏序列帧、星图虚焦和 DreamDoor 近景表现保持一致。
|
||||
- 普通图片命令能中断并清理任意 D2 动效。
|
||||
- 通用小图/大图、风筝、轱辘、序列帧和大图特效可按快照恢复。
|
||||
- 返回菜单、切章、读档和重复进入梦境后没有残留动态节点、材质属性或 DOTween。
|
||||
|
||||
## 不在本次范围
|
||||
|
||||
- 不保存动画的逐帧进度、Tween 中间值或随机种子。
|
||||
- 不重构 Bloom、曝光和 `DreamDoorSystem` 自身状态机。
|
||||
- 不修改 Yarn 剧情内容或 `#line:` 标签。
|
||||
- 不修改现有资源名、Addressable key 和视觉参数。
|
||||
Reference in New Issue
Block a user