主题
Reactive(响应式联动)总览
程序集:RocPlay.Extensions.Reactive
源码根目录:Assets/RocPlay/Extensions/Reactive/
依赖:仅引用主程序集 RocPlay(RocPlay.Core 中的 RocLog 等)。
本扩展是一套轻量、无外部 Rx 依赖的「可联动数据流」:谁产出变化(IRocLinkable<T>)、谁消费变化(IRocLinker<T> 或 Link(Action<T>))、怎么结束监听(IDisposable.Dispose)。细节按下面 最小心智模型 把握即可,再按需下钻分册。
最小心智模型
- 先定「状态从哪来」:多数情况用
RocLinkableProperty<T>包一层T;Value变了就沿链路OnNext。相等值(EqualityComparer<T>.Default)不推,避免空转。 - 再定「谁跟着变」:
property.Link(v => …)或property.LinkTo(this, v => …)。前者你要自己Dispose;后者把句柄登记在owner的 GameObject 上,owner销毁时自动退订(见 Unity)。 - 链式只是套壳:
When/As/CombineLatest返回的仍是IRocLinkable<…>,本质还是 「上游 Link 下游 linker」;最后一环通常Link(Action)或手写IRocLinker。 - 和
RocEventBus的分工:EventBus 适合 离散、一对多、跨模块广播;Linkable 适合 同一状态、多观察点、连续同步(设置项、VM 字段、两处 UI 绑同一数)。不必二选一,可并存。 - 线程与 Unity:谁在什么线程改
Value,OnNext就在什么线程跑;回调里若碰 UnityEngine.Object,请在业务层切主线程(见 主线程检查与调度(RocMainThreadDispatcher))。
何时使用
| 适合 | 不太适合 |
|---|---|
| ViewModel 式字段、设置项、简单状态机需要 多处 UI 或非 UI 同步 | 需要完整 冷/热 Observable、调度器、多线程流 时,更宜引入 UniRx / R3 等专用库 |
| 希望 Dispose 即可退订,并与 MonoBehaviour 生命周期 对齐 | 超高频每帧推送且对分配极度敏感的路径(通知时会 复制 linker 列表,见 核心) |
文档分册(本站拆层)
| 分册 | 内容 |
|---|---|
| 核心与属性 | IRocLinkable / IRocLinker、RocLinkableProperty、订阅语义与线程注意 |
| 操作符与组合 | When / As / CombineLatest、Link(Action) |
| Unity 与 UI 绑定 | LinkTo、RocLinkUIBindingExtensions、与 uGUI 控件双向联动 |
| 示例 | 纯逻辑联动、操作符链式、Unity 绑定三个最小落地示例 |
源码目录(与磁盘一致)
Assets/RocPlay/Extensions/Reactive/
├── Core/
│ ├── IRocLinkable.cs
│ ├── RocLinkableProperty.cs
│ └── RocLinkableExtensions.cs
├── Unity/
│ ├── RocLinkLifecycleExtensions.cs
│ └── RocLinkUIBindingExtensions.cs
└── RocPlay.Extensions.Reactive.asmdef