概述
课程地址 : 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);
});
}
}
最后
以上就是俊秀冥王星为你收集整理的UniRx第一季学习(六) ------ ObservableWWW/ReactiveCommand /ReactiveCollection/ ReactiveDictionary/AsyncOper一.ObservableWWW优雅的⽹络请求操作二.ReactiveCommand 三.ReactiveCollection 四.ReactiveDictionary 五.AsyncOperation加载场景的全部内容,希望文章能够帮你解决UniRx第一季学习(六) ------ ObservableWWW/ReactiveCommand /ReactiveCollection/ ReactiveDictionary/AsyncOper一.ObservableWWW优雅的⽹络请求操作二.ReactiveCommand 三.ReactiveCollection 四.ReactiveDictionary 五.AsyncOperation加载场景所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复