UniWb-1- UniRx 响应式编程插件

 

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 ! 它就是那个桥梁~。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值