Chinar blog :www.chinar.xin
Chinar 坚持将简单的生活方式,带给世人! (拥有更好的阅读体验 —— 高分辨率用户请根据需求调整网页缩放比例) |
助力学习理解 UniRx 响应式编程的函数、写法 为新手节省宝贵的时间,避免采坑! |
Chinar 教程效果:暂时留空
UniRx
——是 Unity 商店中一个免费插件
,它为我们提供了一种 响应式编程
的方式
帮助我们解决 代码耦合、异步逻辑难以控制
等问题
由于其简化了逻辑与代码量,学会后代码的可读性也不错,Chinar 极力推荐,此等神器级别插件
UniRx (或 Unity 项目-商店直接下载导入)
观察.Update.订阅(要做的事)
点击鼠标左右键,分别输出 “鼠标左键”、“鼠标右键”
// ========================================================
// 描述:UniRX - Update
// 作者:Chinar
// 创建时间:2018-11-14 16:27:35
// 版 本:1.0
// ========================================================
using UniRx;
using UnityEngine;
public class ChinarUpdate : MonoBehaviour
{
///
/// 初始化函数
///
void Start()
{
//观察.Update.订阅(要做的事)
Observable.EveryUpdate().Subscribe(_ =>
{
if (Input.GetMouseButtonDown(0))
{
print("鼠标左键");
}
});
Observable.EveryUpdate().Subscribe(_ =>
{
if (Input.GetMouseButtonDown(1))
{
print("鼠标右键");
}
});
}
}
注意:后边就不全粘所有代码了,只具体到完整函数,无特殊标记,代码都在Start()
函数中写
First(条件)
—— 条件:只在第一次满足条件时,通过
AddTo(对象)
——事件流的生命周期
首次点击鼠标左键,输出“只执行一次”,以后不再执行
void Start()
{
Observable.EveryUpdate() //观察
.First(_ => Input.GetMouseButtonUp(0)) //条件
.Subscribe(_ => print("只执行一次")) //订阅
.AddTo(this); //给事件流添加声明周期(PS:何时消失)
}
void Start()
{
//如果不添加 this ,那 Observable就是全局的,这个方法在重载场景时不会被释放,会无限叠加
Observable.EveryUpdate().Subscribe(_ => print("Chinar")).AddTo(this);
this.UpdateAsObservable().Subscribe(_ => print("Chinar")); //等同于上边:省去了AddTo,this指明了事件流的对象生命
}
< 1.
win+R
打开运行 输入cmd
控制台中输入
ping qiniu.chinar.xin
就是 ——ping
空格你自定义的域名
2. 或者左侧栏
→融合CDN
→域名管理
中查看域名状态(添加CNAME后,刷新可能会有延迟)>
using UniRx;
using UniRx.Triggers;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
///
/// UI相关、按钮、图片、文本框
/// 脚本挂载:Canvas
///
public class ChinarUguiOnClick : MonoBehaviour
{
private ReactiveProperty<int> testIntProperty = new ReactiveProperty<int>(88); //指明响应属性 int,值88
///
/// 初始化函数
///
void Start()
{
//按钮的事件绑定
//不添加 add to,绑定的监听函数不会叠加
transform.Find("Button").GetComponent<Button>().OnClickAsObservable().Subscribe(_ => print("按钮事件被执行"));
transform.Find("Reload Button").GetComponent<Button>().OnClickAsObservable().Subscribe(_ => { SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex); }); //重载当前场景
//图片的事件注册
var image = transform.Find("Image").GetComponent<Image>();
image.OnBeginDragAsObservable().Subscribe(_ => print("开始拖动"));
image.OnDragAsObservable().Subscribe(_ =>
{
print("正在拖动");
image.transform.position = Input.mousePosition; //移动图
});
image.OnEndDragAsObservable().Subscribe(_ => print("拖动完成"));
//响应 int 直接订阅 Text
testIntProperty.SubscribeToText(GameObject.Find("Text Subscribe").GetComponent<Text>());
}
}
GetComponent<Button>().OnClickAsObservable().Select(_=>"A")//按钮绑定
GetComponent<Button>().OnPointerClickAsObservable().Subscribe();//支持Ui Event各种事件
GetComponent<Button>().OnClickAsObservable().Select(_=>"A")//按钮绑定
GetComponent<Button>().OnPointerClickAsObservable().Subscribe();//支持Ui Event各种事件
Observable.FromCoroutine(协程函数)
—— 协程转 Observable
Observable.Timer(TimeSpan.FromSeconds(1)).ToYieldInstruction()
—— Observable 转 Yield
void Start()
{
Observable.FromCoroutine(TestIEnumerator); //协程转 Observable
}
private IEnumerator TestIEnumerator()
{
yield return Observable.Timer(TimeSpan.FromSeconds(1)).ToYieldInstruction(); // 转 指令、
print("Chinar Test-Func");
}
Where()
—— 当多个事件流,需要根据逻辑满足所有都执行后,才触发执行
1:等待2个协程执行完毕
2:当所有事件执行完毕后
void Start()
{
//第一种:等待协程都执行完毕
var streamA = Observable.FromCoroutine(A);
var streamB = Observable.FromCoroutine(B);
Observable.WhenAll(streamA, streamB).Subscribe(_ => print("WenAll执行成功!"));
//第二种:所有操作执行一次后,执行以下订阅
var event1 = this.UpdateAsObservable().Where(_ => Input.GetMouseButtonDown(0)).First();
var event2 = this.UpdateAsObservable().Where(_ => Input.GetMouseButtonDown(1)).First();
Observable.WhenAll(event1, event2).Subscribe(_ => print("左右键执行一次后,执行操作!"));
}
IEnumerator A()
{
yield return new WaitForSeconds(1);
print("A");
}
IEnumerator B()
{
yield return new WaitForSeconds(2);
print("B");
}
Observable.Start()
—— 开启一个线程
ObserveOnMainThread()
—— 线程结果返回到主线程中,在主线程中观察
void Start()
{
var stream1 = Observable.Start(() =>
{
Thread.Sleep(5000);//5000毫秒
print("等待了5秒");
return 1;
}); //线程1
var stream2 = Observable.Start(() =>
{
Thread.Sleep(TimeSpan.FromSeconds(2));
print("等待2秒");
return 2;
}); //线程2
Observable.WhenAll(stream1, stream2).ObserveOnMainThread().Subscribe(_ => //当线程执行完毕,将其他线程中的值,返回到主线程中
{
print(_[0]);
print(_[1]);
});
}
new ScheduledNotifier
—— 声明一个预定进度对象
ObserveOnMainThread()
—— 线程结果返回到主线程中,在主线程中观察
//第一个 print,请求正常信息
//第二个 print,错误信息
ObservableWWW.Get("http://www.chinar.xin/asdf").Subscribe(print, print);//请求一个错误的网路地址
void Start()
{
var slider = GameObject.Find("Slider").GetComponent<Slider>(); //滑动器
var progressText = GameObject.Find("ProgressText").GetComponent<Text>(); //进度条文本
var progressNotifier = new ScheduledNotifier<float>(); //RX 预定通知 float
ObservableWWW.GetAndGetBytes("http://www.chinar.xin/TestUpdate/granulesprite.unity3d", progress: progressNotifier).Subscribe(bytes => { }); //下载完成,做储存
progressNotifier.Subscribe(progressFloat => { slider.value = progressFloat; }); //更新进度
progressNotifier.SubscribeToText(progressText); //进度值显示在 progressText
}
Observable.Start()
—— 开启一个线程
ObserveOnMainThread()
—— 线程结果返回到主线程中,在主线程中观察
void Start()
{
var stream1 = Observable.Start(() =>
{
Thread.Sleep(4000);//4000毫秒
print("等待了4秒");
return 1;
}); //线程1
var stream2 = Observable.Start(() =>
{
Thread.Sleep(TimeSpan.FromSeconds(2));
print("等待2秒");
return 2;
}); //线程2
Observable.WhenAll(stream1, stream2).ObserveOnMainThread().Subscribe(_ => //当线程执行完毕,将其他线程中的值,返回到主线程中
{
print(_[0]);
print(_[1]);
});
}
Observable.Start()
—— 开启一个线程
ObserveOnMainThread()
—— 线程结果返回到主线程中,在主线程中观察
void Start()
{
var stream1 = Observable.Start(() =>
{
Thread.Sleep(4000);//4000毫秒
print("等待了4秒");
return 1;
}); //线程1
var stream2 = Observable.Start(() =>
{
Thread.Sleep(TimeSpan.FromSeconds(2));
print("等待2秒");
return 2;
}); //线程2
Observable.WhenAll(stream1, stream2).ObserveOnMainThread().Subscribe(_ => //当线程执行完毕,将其他线程中的值,返回到主线程中
{
print(_[0]);
print(_[1]);
});
}
Observable.Start()
—— 开启一个线程
ObserveOnMainThread()
—— 线程结果返回到主线程中,在主线程中观察
void Start()
{
var stream1 = Observable.Start(() =>
{
Thread.Sleep(4000);//4000毫秒
print("等待了4秒");
return 1;
}); //线程1
var stream2 = Observable.Start(() =>
{
Thread.Sleep(TimeSpan.FromSeconds(2));
print("等待2秒");
return 2;
}); //线程2
Observable.WhenAll(stream1, stream2).ObserveOnMainThread().Subscribe(_ => //当线程执行完毕,将其他线程中的值,返回到主线程中
{
print(_[0]);
print(_[1]);
});
}
Observable.Start()
—— 开启一个线程
ObserveOnMainThread()
—— 线程结果返回到主线程中,在主线程中观察
void Start()
{
var stream1 = Observable.Start(() =>
{
Thread.Sleep(4000);//4000毫秒
print("等待了4秒");
return 1;
}); //线程1
var stream2 = Observable.Start(() =>
{
Thread.Sleep(TimeSpan.FromSeconds(2));
print("等待2秒");
return 2;
}); //线程2
Observable.WhenAll(stream1, stream2).ObserveOnMainThread().Subscribe(_ => //当线程执行完毕,将其他线程中的值,返回到主线程中
{
print(_[0]);
print(_[1]);
});
}
Observable.Start()
—— 开启一个线程
ObserveOnMainThread()
—— 线程结果返回到主线程中,在主线程中观察
void Start()
{
var stream1 = Observable.Start(() =>
{
Thread.Sleep(4000);//4000毫秒
print("等待了4秒");
return 1;
}); //线程1
var stream2 = Observable.Start(() =>
{
Thread.Sleep(TimeSpan.FromSeconds(2));
print("等待2秒");
return 2;
}); //线程2
Observable.WhenAll(stream1, stream2).ObserveOnMainThread().Subscribe(_ => //当线程执行完毕,将其他线程中的值,返回到主线程中
{
print(_[0]);
print(_[1]);
});
}
Chinar 提供一站式《零》基础教程 使有限时间 具备无限可能! |
Chinar 知你所想,予你所求!( Chinar Blog )
本博客为非营利性个人原创,除部分有明确署名的作品外,所刊登的所有作品的著作权均为本人所拥有,本人保留所有法定权利。违者必究
对于需要复制、转载、链接和传播博客文章或内容的,请及时和本博主进行联系,留言,Email: [email protected]
对于经本博主明确授权和许可使用文章及内容的,使用时请注明文章或内容出处并注明网址