UniRx第一季学习(六) ------ ObservableWWW/ReactiveCommand /ReactiveCollection/ ReactiveDictionary/AsyncOper

课程地址 : http://www.sikiedu.com/course/271

凉鞋大大的,可以的话大家多支持一波~


一.ObservableWWW优雅的⽹络请求操作

以往我们不管使⽤ WWW 还是 UnityWebRequest 都要使⽤ Coroutine 去驱动。但是使⽤协程写出来的代码,需要⼀堆判断,导致代码⾮常混乱。

void Start()
        {
            ObservableWWW.Get("http://sikiedu.com")
                         .Subscribe(responseText =>
                         {
                             Debug.Log(responseText);
                         }, e =>
                         {
                             Debug.LogError(e);
                         });
        }

除了 Get 也⽀持了 Post,还有 GetWWW 和 PostWWW 这种的辅助封装,还有 GetAndGetBytes 和PostAndGetBytes。

ObservableWWW 的 API 都可以传进去⼀个 ScheduledNotifier<T>() ,⽤来监听下载进度的。Subscribe 之后传回来的值则是,当前的进度。

 private void Start()
        {
            var progressObservable = new ScheduledNotifier<float>();

            ObservableWWW.GetAndGetBytes("http://liangxiegame.com/media/QFramework_v0.0.9.unitypackage", progress:progressObservable)
                         .Subscribe(bytes => 
                        { 
            
                        });

            progressObservable.Subscribe(progress =>
            {
                Debug.LogFormat("进度为:{0}", progress);
            });
        }

⽽且 ObservableWWW 的 Get 和 Post 请求都可以⾃⼰传对应的 header 和 WWWForm。
除了常⽤的 Get 和 Post 请求,也对 AssetBundle 的加载也做了简单的封装。
提供了诸如 ObservableWWW.LoadFromCacheOrDownload 这样的 API。如果想深⼊了解,可以参考 ObservableWWW.cs

另外多个一起下载:

  void Start()
        {
            var sikieduStream = ObservableWWW.Get("http://sikiedu.com");
            var qframeworkStream = ObservableWWW.Get("http://qframework.io");

            Observable.WhenAll(sikieduStream, qframeworkStream)
                      .Subscribe(responseTexts =>
                      {
                          Debug.Log(responseTexts[0].Substring(0, 100));
                          Debug.Log(responseTexts[1].Substring(0, 100));
                      });
        }

二.ReactiveCommand 

它提供了两个 API,CanExecte和Execute

Execute ⽅法是被外部调⽤的。也就是这个 Command 的执⾏。这个很容易理解,只要外部调⽤的Execute 就会执⾏。⽽ CanExecute 则是内部使⽤的,并且对外部提供了只读访问。当 CanExecute 为 false 时,在外部调⽤ Execute 则该 Command 不会被执⾏。当 CanExecute 为 true 时,在外部调⽤ Execute 则该 Command 会被执⾏。其他的 Observable决定 CanExecute 为 false 或 true ,新创建的 ReactiveCommand 默认 CanExecute 为 true。

以下实现的是鼠标左键按下输出字符,抬起取消 :

 private void Start()
        {
            var mouseDownStream = Observable.EveryUpdate().Where(_ => Input.GetMouseButtonDown(0)).Select(_ => true);
            var mouseUpStream = Observable.EveryUpdate().Where(_ => Input.GetMouseButtonUp(0)).Select(_ => false);

            var isMouseUp = Observable.Merge(mouseUpStream, mouseDownStream);

            var reactiveCommand = new ReactiveCommand(isMouseUp, false);

            reactiveCommand.Subscribe(_ =>
            {
                Debug.Log("reactive command executed;");
            });

            Observable.EveryUpdate().Subscribe(_ =>
            {
                reactiveCommand.Execute();
            });
        }

当然 ReactiveCommand 也是可以被订阅(Subscribe) 的,在订阅之前呢,也可以使⽤ Where 等操作符进⾏事件操作。

三.ReactiveCollection 

类似于 List。

ObserverAdd // 当 新的 Item 添加则会触发
ObserverRemove // 删除
ObserverReplace // 替换(Update)
ObserverMove // 移动
ObserverCountChanged // 数量有改变(Add、Remove)

四.ReactiveDictionary 

功能与 Dictionary 一样.

ObserverAdd // 当 新的 Item 添加则会触发
ObserverRemove // 删除
ObserverReplace // 替换(Update)
ObserverMove // 移动
ObserverCountChanged // 数量有改变(Add、Remove)

五.AsyncOperation加载场景

我们在异步加载资源或者异步加载场景的时候往往会⽤到 AsyncOperation。
UniRx 对 AsyncOperation 做了⽀持。使得加载操作可以很容易地监听加载进度。

public class AsyncOperationExample : MonoBehaviour
{
   void Start()
   {
      var progressObservable = new ScheduledNotifier<float>();
      SceneManager.LoadSceneAsync(0).AsAsyncOperationObservable(progressObservable)
      .Subscribe(asyncOperation =>
      {
            Debug.Log("load done");
            Resources.LoadAsync<GameObject>("TestCanvas").AsAsyncOperationObservable()                                         
            .Subscribe(resourceRequest =>
            {
               Instantiate(resourceRequest.asset);
            });
      });
      progressObservable.Subscribe(progress =>
      {
            Debug.LogFormat("加载了:{0}", progress);
      });
   }
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值