UniRx

凉鞋的系统教程(账号魔法师13)
https://liangxiegame.com/zhuanlan/list/3a2f9df9-e232-43e6-91d9-19efc9067fbf

常用案例:
https://blog.csdn.net/JianZuoGuang/article/details/100774639

using UniRx;
using UniRx.Triggers;
鼠标点击

Observable.EveryUpdate() //事件发布方.开始Update的事件监听
            .Where(_ => Input.GetKeyDown(0)) //进行bool委托判断._参数传的是本事件启动后第几帧.0开始
            .First() //只获取第一次的点击事件.只会执行一次条件符合的.有个bool的重载
            .Subscribe(_ => //订阅事件. _跟where的值一样
            {
                Debug.Log("鼠标点击");
            });
            //流水式运行.每帧->条件完成->第一次过滤->订阅事件

定时

        Observable.Timer(TimeSpan.FromSeconds(5)).Subscribe(打印"鼠标点击");//5秒后出发
        //尽量AddTo(this).增加生命周期绑定.否则
        GameObject.Destroy(gameObject,1f);//销毁后.仍然会打印"鼠标点击".
        
        //两个参数
        Observable.Timer(TimeSpan.FromSeconds(2))
            .Subscribe(_ => print("2秒到" + Time.time),
                () =>
                {
                    print("On完成" + Time.time);//和上上面这个委托同时完成
                });

UI

        GetComponent<Button>().OnClickAsObservable().Subscribe();
        GetComponent<Toggle>().OnValueChangedAsObservable().Subscribe();
        //订阅Trigger事件.
        GetComponent<Graphic>().OnBeginDragAsObservable().Subscribe(_ => print("开始拽托"));
        GetComponent<Graphic>().OnDragAsObservable().Subscribe(_ => print("正在拽托"));
        GetComponent<Graphic>().OnEndDragAsObservable().Subscribe(_ => print("结束拽托"));

ReactiveProperty响应式属性

    public  ReactiveProperty<int> i=new IntReactiveProperty();
    void Start()
    {
        i.Subscribe(_ => print(_.ToString()));//i被赋值时调用,_是i.value的值.
    }

ReactiveCollection响应式集合
List增加删除会触发订阅事件.
ReactiveDictionary<>类似

    ReactiveCollection<string> nameList = new ReactiveCollection<string>
    {
        "Value1",
        "Value2"
    };
    void Start()
    {
        foreach (var v in nameList)//遍历list
        {
            print(v);//打印集合里的对象. string类型的
        }

        nameList.ObserveAdd().Subscribe(新元素 => print("index:" + 新元素.Index+" , value:"+ 新元素.Value));//list增加元素事件. 输出 添加元素的 索引和值
        nameList.ObserveRemove().Subscribe(removeUrl => print("删除:" + removeUrl));//list元素删除事件
        nameList.ObserveCountChanged().Subscribe(count => print("count总数:" + count));//数量改变事件.无论add和删除list元素都会触发

        nameList.Add("值3");//list.add增加元素
        nameList.Remove("Value2");//list移除元素
        //还有替换,移动等操作
    }


ReactiveCommand响应式命令

        var reactiveCommand=new ReactiveCommand();//空参数的初始值为true.  如果为false.执行Execute是不会调用的.
        reactiveCommand.Subscribe(_ =>//如果执行时的订阅
        {
            print("execute");
        });
        reactiveCommand.Execute();//执行一次
        reactiveCommand.Execute();//再执行一次
        reactiveCommand.Execute();
        var mouseDownStream = Observable.EveryUpdate().Where(_ => Input.GetMouseButtonDown(0)).Select(_ => true);//左键返回true
        var mouseUpStream = Observable.EveryUpdate().Where(_ => Input.GetMouseButtonUp(1)).Select(_ => false);//右键返回false
        var isMouseUp = Observable.Merge(mouseUpStream, mouseDownStream);//合并左右事件流
        var reactiveCommand=new ReactiveCommand(isMouseUp,false);//初始值为false.默认不成功
        reactiveCommand.Subscribe(_ => { print("isMouseUp运行"); });//执行成功打印
        Observable.EveryUpdate().Subscribe(_ => { reactiveCommand.Execute(); });//每帧都执行.
        //点击左键后一直执行打印.点击右键后一直不执行

泛型响应式命令

        var reactiveCommand =new ReactiveCommand<int>();//泛型
        reactiveCommand.Where(x => x > 0).Subscribe(x => print("X大于0" + x));//增加订阅
        reactiveCommand.Where(x => x < 0).Subscribe(x => print("X小于0" + x));//增加订阅

        reactiveCommand.Execute(10);//执行并且传递参数.根据传递的参数执行不同的订阅事件命令

WhenAll所有条件第一次完成

        var aStream = transform.GetChild(0).GetComponent<Button>().OnClickAsObservable().First();//貌似必须加First才有用.
        var bStream = transform.GetChild(1).GetComponent<Button>().OnClickAsObservable().First();
        var cStream = transform.GetChild(2).GetComponent<Button>().OnClickAsObservable().First();
        Observable.WhenAll(aStream, bStream, cStream).Subscribe(_ =>//合并事件流
        {
            Debug.Log("全部完成");
        }).AddTo(this);
        //所谓的WhenAll是指里面的IObservable<T>参数的所有IDisposable.Dispose()被调回调用完成后执行.  
        //简单的说就是所有参数对象的Dispose()被调用后算完成

WWW

        ObservableWWW.Get("http://www.bilibili.com").Subscribe(text => { print(text); });//获取网页内容

        //--
        var aStream = ObservableWWW.Get("http://www.A.com");//事件流a
        var bStream = ObservableWWW.Get("http://www.B.com");//事件流b
        Observable.WhenAll(aStream, bStream)
            .Subscribe(结果 =>
            {
                print(结果[0].Substring(0, 100)); //获取100个字符
                print(结果[1].Substring(0, 100)); //获取100个字符
            });

AsAsyncOperationObservable异步加载事件

        var progressObservable =new ScheduledNotifier<float>();//进度观察者  = 安排通知
        SceneManager.LoadSceneAsync(0).AsAsyncOperationObservable(progressObservable)//异步加载场景.进度传给progressObservable
            .Subscribe(_ =>
            {
                print("加载完成");
            });
        progressObservable.Subscribe(progress =>//订阅进度事件
        {
            print("进度:"+progress);
        });

Start多线程Thread

        var threadAStream = Observable.Start(() =>//开启一个线程
        {//线程委托代码
            Thread.Sleep(TimeSpan.FromSeconds(3));//线程正在计算(模拟)
            return 30;//返回计算结果
        });

        var threadBStream = Observable.Start(() =>
        {
            Thread.Sleep(TimeSpan.FromSeconds(1));
            return 10;
        });

        Observable.WhenAll(threadAStream, threadBStream)
            .ObserveOnMainThread() //两个线程都完成后,合并到主线程
            .Subscribe(results => { Debug.LogFormat("{0}:{1}", results[0], results[1]); });
        //运行在主线程.results[0]由WhenAll添加顺序决定
        //ObserveOnMainThread意思是把WhenAll结果转换到主线程上.这样Subscribe里的回调就可以
        //使用Unity的API了(Uinty的很多API不可以在其他线程中使用).

Select操作符和Merge合并事件

        var aStream = transform.GetChild(0).GetComponent<Button>().OnClickAsObservable().Select(_ => "A");
        //Select选择操作符: 返回的参数类型将作用于订阅事件
        var bStream = transform.GetChild(1).GetComponent<Button>().OnClickAsObservable().Select(_ => "B");
        var cStream = transform.GetChild(2).GetComponent<Button>().OnClickAsObservable().Select(_ => "C");
        Observable.Merge(aStream, cStream, bStream)
            .First()
            .Subscribe(id => { print("id=" + id); });//打印select返回的值
        //只会触发打印一个,然后就失效关闭了

Distinct操作符
剔除重复的对象

        var sList = new List<string> { "3","1","2","3" };
        sList.ToObservable().Distinct().Subscribe(v => print(v));//如果312. 最后面的3重复了会被丢弃

Last最后符合条件的元素

        var sList = new List<string> { "3","1","222","3" };
        var s = sList.Last(v => v.Length > 1);//最后一个符合条件的对象.如果为空.则返回最后一个元素
        print(s);//输入222
        //
        sList.ToObservable().Last(v => v.Length > 1).Subscribe(x => print(x));//同上

Take最前的N个元素

        int[] 分数arr = {3, 2, 5, 1};
        var 最前arr = 分数arr.OrderBy(分 => 分).Take(2);//Take返回列表中前2个元素
        foreach (var v in 最前arr)
            print(v);//输出最前2个元素,,,,,1,,2
        //--
        Observable.EveryUpdate().Where(_ => Input.GetMouseButtonDown(0))
            .Take(5).Subscribe(_ => print("点击"));//只有前5次点击有效.因为take只会提取前5个元素

应用程序事件

        Observable.EveryApplicationPause()//程序暂停
        Observable.EveryApplicationFocus()//程序焦点

Trigger

        this.UpdateAsObservable().Subscribe()
        //同等于        
        Observable.EveryUpdate().Subscribe().AddTo(this);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容