# P0-4: R3 + Data 类规范需求详细文档 ## 对齐说明 本文档以 `docs/requirements/p0-requirements-set.md` 为准。P0 使用 R3 作为响应式基础,不自研响应式系统,不做 UI 自动绑定。 ## 目标 建立游戏运行时 Data 的组织方式、响应式状态表达、ViewModel 访问规则和存档序列化约定。 ## Data 类规范 ```csharp public sealed class PlayerData { public ReactiveProperty Gold { get; } = new(0); public ReactiveProperty Level { get; } = new(1); } ``` 规则: - 一个 Data 类对应一个业务域。 - Data 类注册在全局 Container 中。 - Data 类保持纯 C#,不依赖 Unity API。 - Data 类不持有 View 或 ViewModel 引用。 - Data 类不包含复杂业务流程逻辑。 - Data 类之间不互相直接引用。 - Data 类使用 `ReactiveProperty` 和 `ReactiveCollection` 表达可观察状态。 ## ViewModel 规则 - ViewModel 可以引用 Data。 - ViewModel 负责 UI 表现逻辑和用户操作逻辑。 - ViewModel 不持有 MonoBehaviour 或具体 View 引用。 - ViewModel 订阅必须加入自己的 `CompositeDisposable`,或加入 `FeatureContext.Disposables`。 ## 序列化规则 - `ReactiveProperty` 序列化为 `.Value`。 - `ReactiveCollection` 序列化为 JSON 数组。 - 反序列化到已有 Data 实例时,更新 `.Value` 或集合内容,不替换 Data 实例。 - 反序列化类型不匹配时抛异常并包含字段名。 ## 事件流规则 P0 允许使用 R3 `Subject` 做 Feature 内或明确归属的轻量事件流。 规则: - Subject 生命周期必须有明确所有者。 - Feature 内 Subject 随 Feature Dispose 释放。 - 跨 Feature 持久状态优先使用 Data。 - 不建立全局 Subject 池。 - 不实现独立 EventBus。 ## 暂不做 - 自研响应式系统。 - UI 自动绑定框架。 - 全局 EventBus。 - Data 类 Inspector 可视化。 - 订阅泄漏 Analyzer。 - Data 类之间的复杂关系建模。 ## 验收标准 | # | 标准 | 通过条件 | |---|------|---------| | 1 | Data 创建 | Data 类用 ReactiveProperty 定义字段 | | 2 | 全局共享 | 两个 ViewModel Resolve 到同一个 Data 实例 | | 3 | 响应式同步 | 修改 Data 后订阅者收到通知 | | 4 | ViewModel 隔离 | ViewModel 不引用 MonoBehaviour 或具体 View | | 5 | 序列化 ReactiveProperty | JSON 只包含值,不包含内部状态 | | 6 | 反序列化已有实例 | 已注册 Data 实例被更新而不是替换 | | 7 | ReactiveCollection | 可序列化为数组并恢复 | | 8 | 订阅释放 | Dispose 后订阅不再触发 | | 9 | 纯 C# | Data 类可脱离 Unity 编译 | ## 依赖关系 ```text Data / ViewModel ├── R3 ├── Container ├── ISaveService └── JSON Converter ```