Unity中常用方法
使用觀察者模式對(duì)Unity UI組件進(jìn)行擴(kuò)展
位于UniRx public static class UnityUIComponentExtensions類中
- 觀察Button點(diǎn)擊事件
//Observe onClick event 觀察點(diǎn)擊事件
public static IObservable<Unit> OnClickAsObservable(this Button button)
{
return button.onClick.AsObservable();
}
- 觀察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);
});
}
- 觀察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);
});
}
- 觀察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);
});
}
- 觀察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生命周期
- 每一幀執(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(){};
- 觀察目標(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è)條件:
- 所有的Observable都發(fā)射過數(shù)據(jù)
- 任何一個(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è)子集