UniRx UI拓展API
拓展的方法簽名
拓展的事件簽名
MV®P模式
其他的一些拓展方法
UniRx UI拓展API
全部的拓展內容歸類在一個partial類裏面,UnityUIComponentExtensions;
全部的拓展事件歸類在一個partial類裏面,UnityEventExtensions;
全部的觸發事件歸類在一個partial類裏面,ObservableTriggerExtensions;
拓展的方法簽名
// 將結果<string>訂閱到Text
public static IDisposable SubscribeToText(this IObservable<string> source, Text text)
// 將結果<T>訂閱到Text
public static IDisposable SubscribeToText<T>(this IObservable<T> source, Text text)
// 將通過<T>過濾的結果<string>訂閱到Text
public static IDisposable SubscribeToText<T>(this IObservable<T> source, Text text, Func<T, string> selector)
// 將結果<bool>訂閱到Selectable
public static IDisposable SubscribeToInteractable(this IObservable<bool> source, Selectable selectable)
/// <summary>Observe onClick event.</summary>
public static IObservable<Unit> OnClickAsObservable(this Button button)
/// <summary>Observe onValueChanged with current `isOn` value on subscribe.</summary>
public static IObservable<bool> OnValueChangedAsObservable(this Toggle toggle)
/// <summary>Observe onValueChanged with current `value` on subscribe.</summary>
public static IObservable<float> OnValueChangedAsObservable(this Scrollbar scrollbar)
/// <summary>Observe onValueChanged with current `normalizedPosition` value on subscribe.</summary>
public static IObservable<Vector2> OnValueChangedAsObservable(this ScrollRect scrollRect)
/// <summary>Observe onValueChanged with current `value` on subscribe.</summary>
public static IObservable<float> OnValueChangedAsObservable(this Slider slider)
/// <summary>Observe onEndEdit(Submit) event.</summary>
public static IObservable<string> OnEndEditAsObservable(this InputField inputField)
/// <summary>Observe onValueChanged with current `text` value on subscribe.</summary>
public static IObservable<string> OnValueChangedAsObservable(this InputField inputField)
/// <summary>Observe onValueChanged with current `value` on subscribe.</summary>
public static IObservable<int> OnValueChangedAsObservable(this Dropdown dropdown)
拓展的事件簽名
// 將空UnityEvent回調轉換到UniRx
public static IObservable<Unit> AsObservable(this UnityEngine.Events.UnityEvent unityEvent)
// 將UnityEvent<T>回調轉換到UniRx
public static IObservable<T> AsObservable<T>(this UnityEngine.Events.UnityEvent<T> unityEvent)
// 將元組Tuple<T0, T1>轉換到UniRx
// 因爲UnityEvent只有攜帶一個<T>的回調,使用元組來充數
public static IObservable<Tuple<T0, T1>> AsObservable<T0, T1>(this UnityEngine.Events.UnityEvent<T0, T1> unityEvent)
// 將元組Tuple<T0, T1, T2>轉換到UniRx
public static IObservable<Tuple<T0, T1, T2>> AsObservable<T0, T1, T2>(this UnityEngine.Events.UnityEvent<T0, T1, T2> unityEvent)
// 將元組Tuple<T0, T1, T2, T3>轉換到UniRx
public static IObservable<Tuple<T0, T1, T2, T3>> AsObservable<T0, T1, T2, T3>(this UnityEngine.Events.UnityEvent<T0, T1, T2, T3> unityEvent)
MV®P模式
MVRP全稱是Model-View-(Reactive)Presenter Pattern
爲什麼我們應該使用MVP而不是MVVM?Unity不提供UI綁定機制,創建綁定層太複雜,丟失並且會影響性能;儘管如此,視圖仍需要更新;演示者知道其視圖的組件,並可以對其進行更新;儘管沒有真正的綁定,但是Observables啓用了對通知的訂閱,它的行爲與真實情況非常相似;此模式稱爲反應式演示者。
一個最簡單實用的MVRP代碼
public class No23_UniRxUI : MonoBehaviour
{
// P = Presenter 演示者
// V = View 視圖層
[SerializeField]
private Button mBtnChange;
[SerializeField]
private Text mTxtName;
[SerializeField]
private Text mTxtHp;
void Start()
{
// 這裏需要提供統一入口管理
ViewModel model = new ViewModel();
model.Name.SubscribeToText(mTxtName);
model.Hp.SubscribeToText(mTxtHp);
mBtnChange.OnClickAsObservable().Subscribe(_ =>
{
model.Name.Value = "ChangeName";
model.Hp.Value = 200;
});
}
}
// model 是一對多的關係
// [Model(Reactvie)] model包含了Reactvie響應
public class ViewModel
{
public ReactiveProperty<string> Name
{
get => mName;
set => mName = value;
}
public ReactiveProperty<int> Hp
{
get => mHp;
set => mHp = value;
}
private ReactiveProperty<string> mName;
private ReactiveProperty<int> mHp;
public ViewModel()
{
mName = new StringReactiveProperty("Name");
mHp = new IntReactiveProperty(100);
}
}
代碼解析
視圖是場景,即Unity層次結構。 視圖在初始化時由Unity Engine與Presenters關聯; XxxAsObservable方法使創建事件信號變得簡單,沒有任何開銷; SubscribeToText和SubscribeToInteractable是類似於綁定的簡單幫助程序; 這些可能是簡單的工具,但功能非常強大; 它們在Unity環境中感覺自然,並提供高性能和乾淨的體系結構。
V -> RP -> M -> RP -> V 構成響應式迴路; UniRx提供了全部的方法和類,但是其他的MVVM(or MV*) 可以來替代使用, UniRx/ReactiveProperty只是一個簡單的工具。
其他的一些拓展方法
// 萬能數據監控,selector選擇監控的類型
transform.ObserveEveryValueChanged(t => t.position).Subscribe();
// 當GameObj將要Destroy的時候回調
transform.OnDestroyAsync();
// 當GameObj獲得焦點的時候回調
transform.OnBecameVisibleAsObservable();
// 當GameObj Enable方法的時候回調
transform.OnEnableAsObservable();
// 啓動一個幀率刷新函數
transform.UpdateAsObservable();
// 當transform的父節點有變化的時候回調
transform.OnTransformParentChangedAsObservable();
// 畫布組有變回回調
transform.OnCanvasGroupChangedAsObservable();
// 當粒子有碰撞發生
transform.OnParticleTriggerAsObservable();
//ObservableTriggerExtensions line 330開始全是UI相關事件回調
// app退出回調
Observable.OnceApplicationQuit();
// app從後臺轉到前臺回調
Observable.EveryApplicationFocus();