本文首发于“洪流学堂”微信公众号。
洪流学堂,让你快人几步!
本文译者:郑洪智 - 你的技术探路者
翻译日期2018年2月1日
本文翻译自UniRx(https://github.com/neuecc/UniRx)插件的ReadMe
这个插件是我特别喜欢的一个插件,希望能将这种技术思想传播给大家
UniRx是什么?
UniRx (Unity响应式编程插件) 重写了.Net的响应式扩展。.Net官方的Rx很棒,但是在Unity中无法使用,并且与IOS的IL2CPP有兼容性问题。这个库这些问题并且添加了一些Unity专属的工具类。 支持的平台有:PC/Mac/Android/iOS/WP8/WindowsStore/等等,并且支持Unity4.6之后的所有版本。
上节回顾
如何让你的代码更简洁
如何简化网络操作
如何和协程一起使用
用于多线程
默认调度器
UniRx 中基于时间的操作(Interval, Timer, Buffer(timeSpan), etc) 使用 作为他们的默认调度器。这意味大多数操作符(除了)在单线程上工作,所以 ObserverOn 不是必须的而且不需要处理线程安全。这和标准的 RxNet 不太一样,但是更符合Unity环境。
会受 Time.timeScale 的影响。如果你想要忽略time scale,使用 。
MonoBehaviour的触发器
使用 可以处理Monobehaviour的事件:
支持的触发器列表 UniRx.wiki#UniRx.Triggers.
通过订阅Component/GameObject的扩展方法,控制这些触发器可以更简单。这些方法会自动添加ObservableTrigger到物体上(除了 and ):
之前的UniRx提供了 。这是一个不再支持的过时的接口。请使用 UniRx.Triggers 代替。
创建自定义的触发器
处理Unity的事件的最好办法是转成Observable。如果UniRx自带的触发器还不够的话,你也可以自己创建触发器。下面是一个UGUI的长按触发器:
使用起来和自带触发器一样简单:
Observable 生命周期管理
OnCompleted 什么时候会被调用?使用UniRx的时候Subscription的生命周期管理非常重要。 在attached的物体被销毁的时候调用。其他静态的方法 (, , etc…) 不会自动停止,需要手动去管理。
Rx 提供了一些方法, 例如 可以让你一次性释放多个subscriptions:
如果你想在物体销毁时自动释放,可以用AddTo(GameObject/Component):
AddTo 方法可以带来自动释放。如果你需要一些特殊的 OnCompleted 处理,使用 , , 或 :
处理事件时, 时一个重要但是很危险的方法。可能会造成死循环,一定要小心处理:
UniRx额外提供了一个安全的Repeat方法。: 如果"OnComplete"连续调用,Repeat会自动停止。 , 可以在gameobject被销毁时停止Repeat:
UniRx保证动态observable(FromEvent/Subject/ReactiveProperty/UnityUI.AsObservable…, there are like event) 内有未处理的异常时也能持续工作。什么意思呢?如果在Subscribe内subscribe,里面subscribe的异样不会造成外部的subscribe失效。
这样在处理用户事件时很有用。
所有类的实例提供了一个 方法,可以在每帧监听值的变化:
这很有用。如果监听的目标是一个GameObject, 会在目标被销毁时停止并调用OnCompleted。如果监听目标是C#的对象,OnCompleted会在GC时调用。
未完结,请关注“洪流学堂”微信公众号后续连载
领取专属 10元无门槛券
私享最新 技术干货