Files
aibis-dream/Docs/D2Sleep表现系统拆分与存档重构方案.md
T

5.3 KiB
Raw Blame History

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_spriteshow_large_spritehide_* 和 Showcase 背景命令仍由 BaseYarnCommand 调用 SpriteShowcase

DreamDoorSystem 的大图换图、近景缩放和透明度控制调用 Day2SleepPresentationController。Bloom、曝光、海浪和终端逻辑仍属于 DreamDoorSystem

存档模型

存档只记录可重建的语义终态,不保存 Coroutine、Tween、运行时 GameObject、SpriteMask、材质实例或随机运动瞬时相位。

showcase section

稳定 idshowcaseRestoreOrder69。

ShowcaseSnapshotDto

  • displayModeNone / Small / Large
  • picName:逻辑图片名,不保存加载后的 Sprite
  • isBackgroundVisible:背景遮罩终态。

恢复时通过 ResourceSystem 重新加载图片,并以 0 秒时长应用终态。

day2SleepPresentation section

稳定 idday2SleepPresentationRestoreOrder70。

Day2SleepPresentationSnapshotDto 按模式保存:

模式 保存内容
SmallMotion 图片名、motion profile
Kite 目标高度、风向、乱度
LargeEffects 序列帧前缀/帧数/帧间隔、虚焦参数、缩放倍率、透明度

kite_accent 属于一次性顿挫,不进入快照;轱辘和风筝的随机相位在恢复后从对应语义状态重新开始。

若当前没有 D2 专属状态,Provider 返回 null,不写入该 section。通用大图叠加了 D2 虚焦或门近景效果时,会同时写入 showcaseday2SleepPresentation:先恢复底图,再恢复特效。

恢复顺序

相关表现 Provider 顺序为:

  1. showcase69):恢复普通底图和背景。
  2. day2SleepPresentation(70):恢复 D2 动态层或大图特效。
  3. playTool71):恢复物品展示 UI。
  4. screen80):恢复饱和度和全屏遮罩。

旧存档没有新增 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 和视觉参数。