UniRx日常筆記

Unity中常用方法


使用觀察者模式對(duì)Unity UI組件進(jìn)行擴(kuò)展

位于UniRx public static class UnityUIComponentExtensions類中

  1. 觀察Button點(diǎn)擊事件
//Observe onClick event 觀察點(diǎn)擊事件
public static IObservable<Unit> OnClickAsObservable(this Button button)
{
    return button.onClick.AsObservable();
}
  1. 觀察Toggol值變化
//Observe onValueChanged with current `isOn` value on subscribe 觀察isOn值并傳遞
public static IObservable<bool> OnValueChangedAsObservable(this Toggle toggle)
{
    return Observable.CreateWithState<bool, Toggle>(toggle, (t, observer) =>
    {
        observer.OnNext(t.isOn);
        return t.onValueChanged.AsObservable().Subscribe(observer);
    });
}
  1. 觀察Scrollbar值變化
//Observe onValueChanged with current `value` on subscribe 觀察value值并傳遞給下一個(gè)函數(shù)
public static IObservable<float> OnValueChangedAsObservable(this Scrollbar scrollbar)
{
    return Observable.CreateWithState<float, Scrollbar>(scrollbar, (s, observer) =>
    {
        observer.OnNext(s.value);
        return s.onValueChanged.AsObservable().Subscribe(observer);
    });
}
  1. 觀察Slider值變化
//Observe onValueChanged with current `value` on subscribe 觀察Value值并傳遞
 public static IObservable<float> OnValueChangedAsObservable(this Slider slider)
{
    return Observable.CreateWithState<float, Slider>(slider, (s, observer) =>
    {
        observer.OnNext(s.value);
        return s.onValueChanged.AsObservable().Subscribe(observer);
    });
}
  1. 觀察InputField輸入
//Observe onValueChanged with current `text` value on subscribe 觀察當(dāng)前輸入text并傳遞
public static IObservable<string> OnValueChangedAsObservable(this InputField inputField)
{
    return Observable.CreateWithState<string, InputField>(inputField, (i, observer) =>
    {
        observer.OnNext(i.text);
        return i.onValueChanged.AsObservable().Subscribe(observer);
    });
}
//Observe onEndEdit(Submit) event 觀察輸入結(jié)束事件
public static IObservable<string> OnEndEditAsObservable(this InputField inputField)
{
    return inputField.onEndEdit.AsObservable();
}

UniRx處理協(xié)程

public static IObservable<Unit> FromCoroutine(Func<IEnumerator> coroutine, bool publishEveryYield = false)
{
    return FromCoroutine<Unit>((observer, cancellationToken) => WrapEnumerator(coroutine(), observer, cancellationToken, publishEveryYield));
}
 public static IObservable<T> FromCoroutineValue<T>(Func<IEnumerator> coroutine, bool nullAsNextUpdate = true)
{
    return FromCoroutine<T>((observer, cancellationToken) => WrapEnumeratorYieldValue<T>(coroutine(), observer, cancellationToken, nullAsNextUpdate));
}
public static IObservable<Unit> ToObservable(this IEnumerator coroutine, bool publishEveryYield = false)
{
    return FromCoroutine<Unit>((observer, cancellationToken) => WrapEnumerator(coroutine, observer, cancellationToken, publishEveryYield));
}

Mono生命周期

  1. 每一幀執(zhí)行
public static IObservable<long> EveryUpdate(){};
public static IObservable<long> EveryFixedUpdate(){};
public static IObservable<long> EveryEndOfFrame(){};
public static IObservable<long> EveryLateUpdate(){};
public static IObservable<long> EveryAfterUpdate(){};
  1. 觀察目標(biāo)狀態(tài)
public static IObservable<T> TakeUntilDestroy<T>(this IObservable<T> source, Component target)
{
    return source.TakeUntil(target.OnDestroyAsObservable());
}
public static IObservable<T> RepeatUntilDestroy<T>(this IObservable<T> source, GameObject target)
{
    return RepeatUntilCore(RepeatInfinite(source), target.OnDestroyAsObservable(), target);
}

處理WWW請(qǐng)求

public static IObservable<WWW> GetWWW(string url, Hash headers = null, IProgress<float> progress = null)
{
    return ObservableUnity.FromCoroutine<WWW>((observer, cancellation) => Fetch(new WWW(url, null, (headers ?? new Hash())), observer, progress, cancellation));
}

常用操作符

  • Observable.map:將一個(gè)序列中每次對(duì)外發(fā)射的信息做轉(zhuǎn)換(例:map(x=>x*10))
  • Observable.range:發(fā)射一定數(shù)量值得序列识腿。
  • Observable.toArray: 在序列完成時(shí)將所有發(fā)射值轉(zhuǎn)換為一個(gè)數(shù)組缀遍。
  • Observable.flatMap: 將原始序列流中的元素轉(zhuǎn)化為一個(gè)新的序列流菠齿,并將這個(gè)新的序列流merge到原來的序列中元素的位置遍坟。
  • Observable.startWith: 它會(huì)設(shè)置Observable序列的第一個(gè)值
  • Observable.combineLatest: 類似于promiseAll娜膘,在所有序列有結(jié)果后才會(huì)執(zhí)行
  • Observable.scan: 將序列中每次發(fā)射的值可以做聚合,與reduce類似重贺,reduce會(huì)將整個(gè)序列的值聚合起來赎离,在序列完成時(shí)發(fā)送一個(gè)最終值
  • Observable.sample: 從持續(xù)的序列中取得一定的樣品
  • Observable.merge:將多個(gè)序列合并成一個(gè),可以做OR來使用
  • Observable.timestamp: 能夠得到每個(gè)發(fā)射值的發(fā)射時(shí)的時(shí)間
  • Observable.distinctUntilChanged(compare, selector): selector取出用來比較的key闽撤,compare用來比較兩個(gè)key
  • Observable.takeWhile() 當(dāng)參數(shù)為false時(shí)停止發(fā)射數(shù)據(jù)

創(chuàng)建操作符

  • create:最基本的創(chuàng)建Observable的操作符
  • Start:創(chuàng)建發(fā)射一個(gè)函數(shù)的返回值的Observable
  • range:根據(jù)輸入的初始值n和數(shù)目m發(fā)射一系列大于等于n的m個(gè)值(每次+1)
  • just:將某個(gè)對(duì)象轉(zhuǎn)化為Observable對(duì)象得哆,并且將其發(fā)射出去,可以是一個(gè)數(shù)字哟旗、一個(gè)字符串贩据、數(shù)組、list對(duì)象等
  • defer:只有當(dāng)有Subscriber來訂閱的時(shí)候才會(huì)創(chuàng)建一個(gè)新的Observable對(duì)象,也就是說每次訂閱都會(huì)得到一個(gè)剛創(chuàng)建的最新的Observable對(duì)象闸餐,這可以確保Observable對(duì)象里的數(shù)據(jù)是最新的
  • from:用來將某個(gè)對(duì)象轉(zhuǎn)化為Observable對(duì)象饱亮,并且依次將其內(nèi)容發(fā)射出去。這個(gè)類似于just绎巨,但是just會(huì)將這個(gè)對(duì)象整個(gè)發(fā)射出去近尚。比如說一個(gè)含有10個(gè)數(shù)字的數(shù)組蠕啄,使用from就會(huì)發(fā)射10次场勤,每次發(fā)射一個(gè)數(shù)字,而使用just會(huì)發(fā)射一次來將整個(gè)的數(shù)組發(fā)射出去
  • interval:創(chuàng)建的Observable對(duì)象會(huì)從0開始歼跟,每隔固定的時(shí)間發(fā)射一個(gè)數(shù)字
  • Repeat:將一個(gè)Observable對(duì)象重復(fù)發(fā)射和媳,我們可以指定其發(fā)射的次數(shù)
  • Timer:創(chuàng)建在一個(gè)指定的延遲之后發(fā)射單個(gè)數(shù)據(jù)的Observable

過濾操作符

  • Distinct:刪除序列中重復(fù)的元素,只允許還沒有發(fā)射過的數(shù)據(jù)項(xiàng)通過
  • distinctUntilChanged:和Distinct函數(shù)功能類似哈街,是去掉連續(xù)重復(fù)的數(shù)據(jù)
  • Debounce:與throttleWithTimeOut相同留瞳,如果在設(shè)定好的時(shí)間結(jié)束前源Observable有新的數(shù)據(jù)發(fā)射出來,這個(gè)數(shù)據(jù)就會(huì)被丟棄骚秦,同時(shí)重新開始計(jì)時(shí)她倘,在一個(gè)指定的時(shí)間間隔過去了仍舊沒有發(fā)射一個(gè)璧微,那么它將發(fā)射最后的那個(gè)
  • ElementAt: ElementAt只會(huì)返回指定位置的數(shù)據(jù)。其相關(guān)方法有elementAtOrDefault(int,T)硬梁,可以允許默認(rèn)值
  • Filter: 允許傳入一個(gè)Func前硫,通過的數(shù)據(jù)才會(huì)被發(fā)射,特殊形式ofType(Class):Observable只返回指定類型的數(shù)據(jù)
  • First和Last:First返回滿足條件的第一條數(shù)據(jù)荧止,被實(shí)現(xiàn)為first屹电,firstOrDefault和takeFirst;Last操作符只返回最后一條滿足條件的數(shù)據(jù)跃巡,被實(shí)現(xiàn)為last和lastOrDefault
  • Skip和Take:Skip操作符將源Observable發(fā)射的數(shù)據(jù)過濾掉前n項(xiàng)危号,而Take操作符則只取前n項(xiàng)
  • ThrottleFirst:定期發(fā)射這個(gè)時(shí)間段里源Observable發(fā)射的第一個(gè)數(shù)據(jù)
  • Sample:定時(shí)地發(fā)射源Observable最近發(fā)射的數(shù)據(jù),其他的都會(huì)被過濾掉素邪,等效于ThrottleLast操作符
  • ignoreElements:忽略所有源Observable產(chǎn)生的結(jié)果外莲,只把Observable的onCompleted和onError事件通知給訂閱者
    參考鏈接

合并操作符

  • combinelatest:將2~9個(gè)Observable發(fā)射的數(shù)據(jù)組裝起來然后再發(fā)射出來,不過還有兩個(gè)條件:
    1. 所有的Observable都發(fā)射過數(shù)據(jù)
    2. 任何一個(gè)Observable發(fā)射一個(gè)數(shù)據(jù)娘香,就將所有Observable最新發(fā)射的數(shù)據(jù)按照提供的函數(shù)組裝起來發(fā)射出去
  • Merge:將多個(gè)Observable發(fā)射的數(shù)據(jù)整合起來發(fā)射苍狰,就如同是一個(gè)Observable發(fā)射的數(shù)據(jù)一樣
  • StartWith:會(huì)在源Observable發(fā)射的數(shù)據(jù)前面插上一些數(shù)據(jù)
  • switch:將一個(gè)發(fā)射多個(gè)小Observable的源Observable轉(zhuǎn)化為一個(gè)Observable,然后發(fā)射這多個(gè)小Observable所發(fā)射的數(shù)據(jù)
  • Zip:將多個(gè)Observable發(fā)射的數(shù)據(jù)按順序組合起來烘绽,每個(gè)數(shù)據(jù)只能組合一次淋昭,而且都是有序的。最終組合的數(shù)據(jù)的數(shù)量由發(fā)射數(shù)據(jù)最少的Observable來決定安接。

轉(zhuǎn)換操作符

  • Buffer — 緩存翔忽,可以簡(jiǎn)單的理解為緩存,它定期從Observable收集數(shù)據(jù)到一個(gè)集合盏檐,然后把這些數(shù)據(jù)集合打包發(fā)射歇式,而不是一次發(fā)射一個(gè)
  • FlatMap — 扁平映射,將Observable發(fā)射的數(shù)據(jù)變換為Observables集合胡野,然后將這些Observable發(fā)射的數(shù)據(jù)平坦化的放進(jìn)一個(gè)單獨(dú)的Observable材失,可以認(rèn)為是一個(gè)將嵌套的數(shù)據(jù)結(jié)構(gòu)展開的過程。
  • GroupBy — 分組硫豆,將原來的Observable分拆為Observable集合龙巨,將原始Observable發(fā)射的數(shù)據(jù)按Key分組,每一個(gè)Observable發(fā)射一組不同的數(shù)據(jù)
  • Map — 映射熊响,通過對(duì)序列的每一項(xiàng)都應(yīng)用一個(gè)函數(shù)變換Observable發(fā)射的數(shù)據(jù)旨别,實(shí)質(zhì)是對(duì)序列中的每一項(xiàng)執(zhí)行一個(gè)函數(shù),函數(shù)的參數(shù)就是這個(gè)數(shù)據(jù)項(xiàng)
  • Scan — 掃描汗茄,對(duì)Observable發(fā)射的每一項(xiàng)數(shù)據(jù)應(yīng)用一個(gè)函數(shù)秸弛,然后按順序依次發(fā)射這些值
  • Window — 窗口,定期將來自O(shè)bservable的數(shù)據(jù)分拆成一些Observable窗口,然后發(fā)射這些窗口递览,而不是每次發(fā)射一項(xiàng)叼屠。類似于Buffer,但Buffer發(fā)射的是數(shù)據(jù)绞铃,Window發(fā)射的是Observable环鲤,每一個(gè)Observable發(fā)射原始Observable的數(shù)據(jù)的一個(gè)子集
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市憎兽,隨后出現(xiàn)的幾起案子冷离,更是在濱河造成了極大的恐慌,老刑警劉巖纯命,帶你破解...
    沈念sama閱讀 221,198評(píng)論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件西剥,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡亿汞,警方通過查閱死者的電腦和手機(jī)瞭空,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來疗我,“玉大人咆畏,你說我怎么就攤上這事∥饪悖” “怎么了旧找?”我有些...
    開封第一講書人閱讀 167,643評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)麦牺。 經(jīng)常有香客問我钮蛛,道長(zhǎng),這世上最難降的妖魔是什么剖膳? 我笑而不...
    開封第一講書人閱讀 59,495評(píng)論 1 296
  • 正文 為了忘掉前任魏颓,我火速辦了婚禮,結(jié)果婚禮上吱晒,老公的妹妹穿的比我還像新娘甸饱。我一直安慰自己,他們只是感情好仑濒,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評(píng)論 6 397
  • 文/花漫 我一把揭開白布叹话。 她就那樣靜靜地躺著,像睡著了一般躏精。 火紅的嫁衣襯著肌膚如雪渣刷。 梳的紋絲不亂的頭發(fā)上鹦肿,一...
    開封第一講書人閱讀 52,156評(píng)論 1 308
  • 那天矗烛,我揣著相機(jī)與錄音,去河邊找鬼。 笑死瞭吃,一個(gè)胖子當(dāng)著我的面吹牛碌嘀,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播歪架,決...
    沈念sama閱讀 40,743評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼股冗,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了和蚪?” 一聲冷哼從身側(cè)響起止状,我...
    開封第一講書人閱讀 39,659評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎攒霹,沒想到半個(gè)月后怯疤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,200評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡催束,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評(píng)論 3 340
  • 正文 我和宋清朗相戀三年集峦,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片抠刺。...
    茶點(diǎn)故事閱讀 40,424評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡塔淤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出速妖,到底是詐尸還是另有隱情高蜂,我是刑警寧澤,帶...
    沈念sama閱讀 36,107評(píng)論 5 349
  • 正文 年R本政府宣布罕容,位于F島的核電站妨马,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏杀赢。R本人自食惡果不足惜烘跺,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望脂崔。 院中可真熱鬧滤淳,春花似錦、人聲如沸砌左。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽汇歹。三九已至屁擅,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間产弹,已是汗流浹背派歌。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評(píng)論 1 271
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人胶果。 一個(gè)月前我還...
    沈念sama閱讀 48,798評(píng)論 3 376
  • 正文 我出身青樓匾嘱,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親早抠。 傳聞我的和親對(duì)象是個(gè)殘疾皇子霎烙,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 本篇文章介主要紹RxJava中操作符是以函數(shù)作為基本單位,與響應(yīng)式編程作為結(jié)合使用的蕊连,對(duì)什么是操作悬垃、操作符都有哪些...
    嘎啦果安卓獸閱讀 2,864評(píng)論 0 10
  • 創(chuàng)建操作 用于創(chuàng)建Observable的操作符Create通過調(diào)用觀察者的方法從頭創(chuàng)建一個(gè)ObservableEm...
    rkua閱讀 1,833評(píng)論 0 1
  • 作者: maplejaw本篇只解析標(biāo)準(zhǔn)包中的操作符。對(duì)于擴(kuò)展包甘苍,由于使用率較低盗忱,如有需求,請(qǐng)讀者自行查閱文檔羊赵。 創(chuàng)...
    maplejaw_閱讀 45,691評(píng)論 8 93
  • 注:只包含標(biāo)準(zhǔn)包中的操作符趟佃,用于個(gè)人學(xué)習(xí)及備忘參考博客:http://blog.csdn.net/maplejaw...
    小白要超神閱讀 2,199評(píng)論 2 8
  • 吾妻阿晩闲昭,見信如晤。 自當(dāng)日一別靡挥,已三年之久序矩,未曾想過,可以隱忍如此漫長(zhǎng)的時(shí)間不與你相見跋破。雖三年簸淀,我卻日日如隔三秋...
    長(zhǎng)亭怨慢閱讀 4,298評(píng)論 16 31