UniRx

作者: JJJJJJJJJJC | 来源:发表于2019-10-14 15:14 被阅读0次

凉鞋的系统教程(账号魔法师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);

相关文章

网友评论

      本文标题:UniRx

      本文链接:https://www.haomeiwen.com/subject/yjmtyctx.html