课程地址 : http://www.sikiedu.com/course/271
凉鞋大大的,可以的话大家多支持一波~
一.ObservableWWW优雅的⽹络请求操作
以往我们不管使⽤ WWW 还是 UnityWebRequest 都要使⽤ Coroutine 去驱动。但是使⽤协程写出来的代码,需要⼀堆判断,导致代码⾮常混乱。
1
2
3
4
5
6
7
8
9
10
11void 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 之后传回来的值则是,当前的进度。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15private 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
另外多个一起下载:
1
2
3
4
5
6
7
8
9
10
11
12void 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。
以下实现的是鼠标左键按下输出字符,抬起取消 :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19private 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。
1
2
3
4
5ObserverAdd // 当 新的 Item 添加则会触发 ObserverRemove // 删除 ObserverReplace // 替换(Update) ObserverMove // 移动 ObserverCountChanged // 数量有改变(Add、Remove)
四.ReactiveDictionary
功能与 Dictionary 一样.
1
2
3
4
5ObserverAdd // 当 新的 Item 添加则会触发 ObserverRemove // 删除 ObserverReplace // 替换(Update) ObserverMove // 移动 ObserverCountChanged // 数量有改变(Add、Remove)
五.AsyncOperation加载场景
我们在异步加载资源或者异步加载场景的时候往往会⽤到 AsyncOperation。
UniRx 对 AsyncOperation 做了⽀持。使得加载操作可以很容易地监听加载进度。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21public 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); }); } }
最后
以上就是俊秀冥王星最近收集整理的关于UniRx第一季学习(六) ------ ObservableWWW/ReactiveCommand /ReactiveCollection/ ReactiveDictionary/AsyncOper一.ObservableWWW优雅的⽹络请求操作二.ReactiveCommand 三.ReactiveCollection 四.ReactiveDictionary 五.AsyncOperation加载场景的全部内容,更多相关UniRx第一季学习(六)内容请搜索靠谱客的其他文章。
发表评论 取消回复