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