UniRx UI拓展API
拓展的方法签名
拓展的事件签名
MV®P模式
其他的一些拓展方法
全部的拓展内容归类在一个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)
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();