参考:
之前一篇博客 UniRx 学习——操作符 总结到最后变成了对 Rx 操作符的复习😂,所以这次有针对性的来学习一下 UniRx 这个框架(主要是官方文档)
网络操作
使用 ObservableWWW (其核心就是对 WWW 进行封装)进行异步网络操作:
- 支持
GET/POST方法 - 支持订阅
WWW、string、byte[]、AssetBundle格式的返回 - 支持进度回调
- 支持错误处理
- 支持取消请求
- 可搭配
Observable.WhenAll进行并行异步操作

结合协程(Coroutines)
FromCoroutine
将协程转成 Observable
FromCoroutineVlaue
从协程转成 Observable,并发射 yield return 返回的值
FromMicroCoroutine
将微协程转成 Observable
ToYieldInstruction
将 Observable 转化成协程
StartAsCoroutine
AutoStart observable as coroutine
多线程
Observable.Start() 默认在异步线程运行
默认调度器(DefaultScheduler)
除了 Observable.Start(),UniRx 默认基于时间的操作符都使用 Scheduler.MainThread
Scheduler.MainThread 受 Time.timeScale 的影响,若希望忽略时间缩放可使用 Scheduler.MainThreadIgnoreTimeScale
MonoBehaviour 触发器
Unity 的 GameObject 可以通过添加 UniRx.Triggers 下的触发器组件(ObservableXxxTrigger)来处理事件,如:
1 | cube.AddComponent<ObservableUpdateTrigger>() |
Unity 的 GameObject/Component 也可以直接通过扩展方法(***AsObservable)使用 UniRx.Triggers,如:
1 | // All events can subscribe by ***AsObservable |
罗列一下 UniRx.Triggers 下支持的触发器(不够用可自定义):
1 | ObservableAnimatorTrigger // 动画:移动、反向运动 |
Observable 生命周期管理
使用 IDisposable.AddTo() 管理多个 IDisposable
1 | // CompositeDisposable is similar with List<IDisposable>, manage multiple IDisposable |
如果希望在 GameObject 销毁时,能自动释放订阅,可使用 AddTo(GameObject/Component)
1 | void Start() |
其他可用控制方法:TakeWhile, TakeUntil,TakeUntilDestroy and TakeUntilDisable
1 | Observable.IntervalFrame(30).TakeUntilDisable(this) |
小心使用 Repeat 操作符,避免无限循环订阅,可适当使用 RepeatSafe、RepeatUntilDestroy(gameObject/component) 和 RepeatUntilDisable(gameObject/component)
所有类实例都提供了 ObserveEveryValueChanged() 方法,可以在每帧都检查值的变化
转 Unity Callbacks 为 IObservables
流式日志
UniRx.Diagnostics.Logger
调试
需要使用 UniRx.Diagnostics
应用生命周期钩子
Observable.EveryApplicationPause()Observable.EveryApplicationFocus()Observable.OnceApplicationQuit()
基于帧数时间的操作符
1 | EveryUpdate |
Every* 方法的执行顺序:
1 | EveryGameObjectUpdate(in MainThreadDispatcher's Execution Order) -> |
微协程
微协程是内存高效、快速的协程 worker
可见另一篇博客的分析:UniRx —— MicroCoroutine(微协程)
uGUI 集成
使用 UnityEvent.AsObservable 可以方便地处理 Unity 事件
响应式属性 & 响应式集合
非序列化/非编辑器可见
ReactiveCollectionReactiveDictionaryReactiveProperty
编辑器可见
IntReactivePropertyLongReactivePropertyByteReactivePropertyFloatReactivePropertyDoubleReactivePropertyStringReactivePropertyBoolReactivePropertyVector2ReactivePropertyVector3ReactivePropertyVector4ReactivePropertyColorReactivePropertyRectReactivePropertyAnimationCurveReactivePropertyBoundsReactivePropertyQuaternionReactiveProperty
针对多行和范围的响应式属性
可用 MultilineReactivePropertyAttribute 和 RangeReactivePropertyAttribute 来替代 Multiline 和 Range
自定义编辑器可见的响应式属性:
1 | public enum Fruit |
ReadOnlyReactiveProperty
如果一个 ReactiveProperty 的值只会通过一个流更新,可使用 ReadOnlyReactiveProperty
Model-View-(Reactive)Presenter 模式
暂不研究
响应式命令 & 异步响应式命令
ReactiveCommand 抽象了按钮的 interactable 属性
(PS:对象命名很难与实际用法联系在一起,先不研究)
消息代理 & 异步消息代理
MessageBroker:
1 | // Subscribe message on global-scope. |
AsyncMessageBroker(可以处理异步的 Publish 调用):
1 | AsyncMessageBroker.Default.Subscribe<TestArgs>(x => |
UniRx.Toolkit
对象池 ObjectPool、AsyncObjectPool
UniRx.Async
UniRx.Async is the custom async/await support utilities.