UniRx 是什么
UniRx (Unity响应式编程插件) 重写了.Net的响应式扩展。.Net官方的Rx很棒,但是在Unity中无法使用,并且与IOS的IL2CPP有兼容性问题。这个库这些问题并且添加了一些Unity专属的工具类。 支持的平台有:PC/Mac/Android/iOS/WP8/WindowsStore/等等,并且支持Unity4.6之后的所有版本。
UniRx 在 Unity Asset Store 的地址(免费) - http://u3d.as/content/neuecc/uni-rx-reactive-extensions-for-unity/7tT
更详细的介绍
详细介绍 点击链接会有更详细的介绍
如果你之前没有接触过 类似的响应式插件,类似于 ReactiveX , JavaRx 。 那么你的 unity 游戏如果用到了 UniRx ,就感觉是打开了一扇新的世界大门一般,体验它带来的优雅的美。 当然因为它实在很强大,所以 UniWb 把 UniRx 当成了核心的部分,其它部分或多或少的用到了 UniRx。
更好的去理解
先看 这篇文章, https://blog.csdn.net/qq_14812585/article/details/88596081 , 该篇文章很好的介绍了 流的思想,如果你认真的理解了,那么你对 UniRx 理解将会更深刻。
其中有句话是很富有内涵的 类比面向对象的编程(OOP)——万物皆对象,响应式编程的思想是——万物皆可流
还有句 “万物皆类型“ 。
理解万岁,需要你去细细品味,感觉就像思考哲学问题一样,我从哪里来,要到哪里去,我是谁,谁是我,,,,
好的,偏题了,再来感受 UniRx 流, 其实就像 有一个水管一样 ,我打开了水龙头, 有很多的步骤,过滤杂质,消毒,分流,添加糖,最后变成一瓶汽水,装在瓶里。可能不太合理,但是很形象。 好继续,我开了这个水龙头,但是我立马就关闭了它。 第二次,我开了水龙头,但是我让它一直开着,什么时候关闭它呢 ? 我不确定,因为我不是老板,老板说什么时候关就什么关,那么我就成为了被动的一方,我只是响应老板命令。在第二次我打开水龙头后,整个流水线一直持续着, 那么第二次,就是持续流,第一次就是非持续流。
理解响应
为什么说它是响应式插件呢?
随便看一个例子,
this.UpdateAsObservable().First(_ => Input.GetMouseButtonDown(0))
.Subscribe(_ => Debug.Log("第一次触发 鼠标点击事件,触发之后这个流的生命周期就完了"));
整个例子,代表的意思是,在每一帧检测 鼠标是否按下,按下后,就会输出一段话。
那么它是在响应什么呢? 你一定明白了,它是在响应每一帧的事件流,然后再过滤出 这个事件流里面的 鼠标点击事件流,最后定阅到一个响应函数里。这时,你可能会恍然大悟,终于明白为什么要用 开水龙头这个例子了。
关于 MVP
你一定看到了 ReactiveProperty<long> ,这个东西,如果没有看到,记得去看看,
// Presenter for scene(canvas) root.
public class ReactivePresenter : MonoBehaviour
{
// Presenter is aware of its View (binded in the inspector)
public Button MyButton;
public Toggle MyToggle;
// State-Change-Events from Model by ReactiveProperty
Enemy enemy = new Enemy(1000);
void Start()
{
// Rx supplies user events from Views and Models in a reactive manner
MyButton.OnClickAsObservable().Subscribe(_ => enemy.CurrentHp.Value -= 99);
MyToggle.OnValueChangedAsObservable().SubscribeToInteractable(MyButton);
// Models notify Presenters via Rx, and Presenters update their views
enemy.CurrentHp.SubscribeToText(MyText);
enemy.IsDead.Where(isDead => isDead == true)
.Subscribe(_ =>
{
MyToggle.interactable = MyButton.interactable = false;
});
}
}
// The Model. All property notify when their values change
public class Enemy
{
public ReactiveProperty<long> CurrentHp { get; private set; }
public ReactiveProperty<bool> IsDead { get; private set; }
public Enemy(int initialHp)
{
// Declarative Property
CurrentHp = new ReactiveProperty<long>(initialHp);
IsDead = CurrentHp.Select(x => x <= 0).ToReactiveProperty();
}
}
这就是 UniRx 自带的示例, 你会感叹,居然还能这样写,是的,这就是我觉得它很强大的地方。
你会发现 Enemy 的 IsDead 和 CurrentHp 被订阅到了其它地方,也就是说每当 Enemy 的血量和 是否死亡的时候,UI 直接更新,因为UI 已经订阅了 IsDead 和 CurrentHp 。 没错~!你猜的没错, 这就是订阅者模式。
当然这也是一种 MVP 的架构,但你总会觉得怪怪的,总觉得少点什么东西,对的,P 不见了! P 就是 UniRx ! 它就是那个桥梁~。