23.UniRx專題(UniRx UI拓展和MV(R)P模式)

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();

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章