89 lines
2.7 KiB
Markdown
89 lines
2.7 KiB
Markdown
# P0-4: R3 + Data 类规范需求详细文档
|
|
|
|
## 对齐说明
|
|
|
|
本文档以 `docs/requirements/p0-requirements-set.md` 为准。P0 使用 R3 作为响应式基础,不自研响应式系统,不做 UI 自动绑定。
|
|
|
|
## 目标
|
|
|
|
建立游戏运行时 Data 的组织方式、响应式状态表达、ViewModel 访问规则和存档序列化约定。
|
|
|
|
## Data 类规范
|
|
|
|
```csharp
|
|
public sealed class PlayerData
|
|
{
|
|
public ReactiveProperty<int> Gold { get; } = new(0);
|
|
public ReactiveProperty<int> Level { get; } = new(1);
|
|
}
|
|
```
|
|
|
|
规则:
|
|
|
|
- 一个 Data 类对应一个业务域。
|
|
- Data 类注册在全局 Container 中。
|
|
- Data 类保持纯 C#,不依赖 Unity API。
|
|
- Data 类不持有 View 或 ViewModel 引用。
|
|
- Data 类不包含复杂业务流程逻辑。
|
|
- Data 类之间不互相直接引用。
|
|
- Data 类使用 `ReactiveProperty<T>` 和 `ReactiveCollection<T>` 表达可观察状态。
|
|
|
|
## ViewModel 规则
|
|
|
|
- ViewModel 可以引用 Data。
|
|
- ViewModel 负责 UI 表现逻辑和用户操作逻辑。
|
|
- ViewModel 不持有 MonoBehaviour 或具体 View 引用。
|
|
- ViewModel 订阅必须加入自己的 `CompositeDisposable`,或加入 `FeatureContext.Disposables`。
|
|
|
|
## 序列化规则
|
|
|
|
- `ReactiveProperty<T>` 序列化为 `.Value`。
|
|
- `ReactiveCollection<T>` 序列化为 JSON 数组。
|
|
- 反序列化到已有 Data 实例时,更新 `.Value` 或集合内容,不替换 Data 实例。
|
|
- 反序列化类型不匹配时抛异常并包含字段名。
|
|
|
|
## 事件流规则
|
|
|
|
P0 允许使用 R3 `Subject<T>` 做 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
|
|
```
|