23.UniRx专题(UniRx UI拓展和MV(R)P模式)

UniRx UI拓展API
拓展的方法签名
拓展的事件签名
MV®P模式
其他的一些拓展方法


UniRx UI拓展API

全部的拓展内容归类在一个partial类里面,UnityUIComponentExtensions;
全部的拓展事件归类在一个partial类里面,UnityEventExtensions;
全部的触发事件归类在一个partial类里面,ObservableTriggerExtensions;


拓展的方法签名
// 将结果订阅到Text
public static IDisposable SubscribeToText(this IObservable<string> source, Text text)

// 将结果订阅到Text
public static IDisposable SubscribeToText<T>(this IObservable<T> source, Text text)

// 将通过过滤的结果订阅到Text
public static IDisposable SubscribeToText<T>(this IObservable<T> source, Text text, Func<T, string> selector)

// 将结果订阅到Selectable
public static IDisposable SubscribeToInteractable(this IObservable<bool> source, Selectable selectable)

/// Observe onClick event.
public static IObservable<Unit> OnClickAsObservable(this Button button)

/// Observe onValueChanged with current `isOn` value on subscribe.
public static IObservable<bool> OnValueChangedAsObservable(this Toggle toggle)

/// Observe onValueChanged with current `value` on subscribe.
public static IObservable<float> OnValueChangedAsObservable(this Scrollbar scrollbar)

/// Observe onValueChanged with current `normalizedPosition` value on subscribe.
public static IObservable<Vector2> OnValueChangedAsObservable(this ScrollRect scrollRect)

/// Observe onValueChanged with current `value` on subscribe.
public static IObservable<float> OnValueChangedAsObservable(this Slider slider)

/// Observe onEndEdit(Submit) event.
public static IObservable<string> OnEndEditAsObservable(this InputField inputField)

/// Observe onValueChanged with current `text` value on subscribe.
public static IObservable<string> OnValueChangedAsObservable(this InputField inputField)

/// Observe onValueChanged with current `value` on subscribe.
public static IObservable<int> OnValueChangedAsObservable(this Dropdown dropdown)

拓展的事件签名
// 将空UnityEvent回调转换到UniRx
public static IObservable<Unit> AsObservable(this UnityEngine.Events.UnityEvent unityEvent)

// 将UnityEvent回调转换到UniRx
public static IObservable<T> AsObservable<T>(this UnityEngine.Events.UnityEvent<T> unityEvent)

// 将元组Tuple转换到UniRx
// 因为UnityEvent只有携带一个的回调,使用元组来充数
public static IObservable<Tuple<T0, T1>> AsObservable<T0, T1>(this UnityEngine.Events.UnityEvent<T0, T1> unityEvent)

// 将元组Tuple转换到UniRx
public static IObservable<Tuple<T0, T1, T2>> AsObservable<T0, T1, T2>(this UnityEngine.Events.UnityEvent<T0, T1, T2> unityEvent)

// 将元组Tuple转换到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
23.UniRx专题(UniRx UI拓展和MV(R)P模式)_第1张图片
为什么我们应该使用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环境中感觉自然,并提供高性能和干净的体系结构。
23.UniRx专题(UniRx UI拓展和MV(R)P模式)_第2张图片
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();

你可能感兴趣的:(UniRx,UniRx)