参考:
之前一篇博客 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
事件
响应式属性 & 响应式集合
非序列化/非编辑器可见
ReactiveCollection
ReactiveDictionary
ReactiveProperty
编辑器可见
IntReactiveProperty
LongReactiveProperty
ByteReactiveProperty
FloatReactiveProperty
DoubleReactiveProperty
StringReactiveProperty
BoolReactiveProperty
Vector2ReactiveProperty
Vector3ReactiveProperty
Vector4ReactiveProperty
ColorReactiveProperty
RectReactiveProperty
AnimationCurveReactiveProperty
BoundsReactiveProperty
QuaternionReactiveProperty
针对多行和范围的响应式属性
可用 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.