首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

UniRx-Unity响应式编程插件(2):让多线程更简单

本文首发于“洪流学堂”微信公众号。

洪流学堂,让你快人几步!

本文译者:郑洪智 - 你的技术探路者

翻译日期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时调用。

未完结,请关注“洪流学堂”微信公众号后续连载

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180203A0F7ZY00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券